天天看點

Qt+opencv多攝像頭視訊顯示

上個文章就說了,我正在實作一個智能監控系統。

由此實作了Qt的FTP檔案傳輸:http://blog.csdn.net/u013812682/article/details/52199502。

還有Qt的tcp視訊傳輸:http://blog.csdn.net/u013812682/article/details/52185540。

在此我将實作基于Qt和opencv的基于多攝像頭的視訊顯示。

下一步将是整個系統的智能化操作,可能包括人臉檢測,人臉識别,單攝像頭人物追蹤(也可能是多攝像頭)以及還沒想到的其他功能。

最後将視訊或圖檔上傳雲伺服器

PS:隻有一個usb攝像頭加上筆記本攝像頭測試的,沒有懸挂的攝像頭有點心累呀!!!

整個顯示架構包括了兩個類,一個是自定義的按鈕類,一個是主界面顯示的類;

開始也糾結了好久,多線程這樣的,發現沒有其實也是可以實作的。

有圖有真相:

開始隻有一個按鈕:

Qt+opencv多攝像頭視訊顯示

點選一次就很生成一個新按鈕,并且加載一次攝像頭,

Qt+opencv多攝像頭視訊顯示

有多少攝像頭就可以點選幾次,我設定了最大值是九個,友善檢視(畢竟螢幕大小有限)

上代碼了:

自定義的按鈕:

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include<QPushButton>
#include<QPen>
#include<QPainter>
#include<QMouseEvent>
#include<QLabel>
class MyButton : public QPushButton
{
    Q_OBJECT
public:
   explicit MyButton(QWidget* parent=);
    ~MyButton();
    void paintEvent(QPaintEvent*);
private:
    bool israised;

};

#endif // MYBUTTON_H
           

mybutton.cpp

#include "mybutton.h"

MyButton::MyButton(QWidget *parent) :
    QPushButton(parent)
{
    setAutoFillBackground(true);
}

MyButton::~MyButton()
{

}

void MyButton::paintEvent(QPaintEvent *)
{
    int  w=width();   //按鈕寬度
    int  h=height();   //按鈕高度
    QColor clrw(,,);
    QColor clrb(,,);
    QBrush brw(clrw);
    QBrush brb(clrb);
    QPen  penw(brb,);
    QPen  penb(brb,);
    QPoint  pttop(,);
    QPoint ptbottom(,h);
    QPoint ptleft(w,);
    QPoint ptright(w,h);
    QPainter  g(this);
    if(israised)
    {
       g.setPen(penw);
    }
    else
    {
        g.setPen(penb);
    }
    g.drawLine(pttop,ptleft);
    g.drawLine(ptleft,ptright);
    if(israised)
    {
          g.setPen(penb);
    }
    else
    {
          g.setPen(penw);
    }
    g.drawLine(ptbottom,pttop);
    g.drawLine(ptbottom,ptright);
}

           

這個其實很簡單,實作自定義按鈕的意義在于可以實作點選效果還有就是自帶的QPushbutton是不可以加圖檔背景的(最起碼我不知道怎麼加,要是有人知道,希望不吝賜教),還有一個是按鈕的凹凸感因為重寫的原因也是沒有了,在此我也沒有想到好的方法,要是哪位同學知道的,也可以告訴我 :)

這個是界面類

widget.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include<mybutton.h>
#include<QButtonGroup>
#include<QGridLayout>
#include<QDebug>
#include<opencv2/opencv.hpp>
#include<QTimer>
#include<QImage>
using namespace std;
using namespace cv;
class MainWindow : public QWidget
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = );
    ~MainWindow();
    int num;

private slots:
    void OnClicked();
    void test();
private:
    VideoCapture cap[];
    MyButton* button;
    QPushButton* add_ptn;
    bool add_widget;
    QButtonGroup* bgp;
    QTimer* timer;
    QGridLayout* layout;
};

#endif // MAINWINDOW_H
           

widget.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

int max=;
MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent)
{
    num=;
    add_widget=false;
    bgp=new QButtonGroup;
    timer=new QTimer(this);
    button=new MyButton;

    bgp->addButton(button,);
    bgp->button()->setMinimumSize(,);
    bgp->button()->setMaximumSize(,);
    layout=new QGridLayout;
    layout->addWidget(bgp->button(),,);
    connect(bgp->button(),SIGNAL(pressed()),this,SLOT(OnClicked()));
    connect(timer,SIGNAL(timeout()),this,SLOT(test()));

    resize(,);
    setLayout(layout);
    }

MainWindow::~MainWindow()
{
}

void MainWindow::OnClicked()
{
    timer->start();
    num++;
    for(int i=;i<num;i++){
        cap[i].open(i);
        if(!cap[i].isOpened()){
            qDebug()<<"cap["<<i<<"] not open!";
            //            timer->stop();
        }
    }
    add_widget=true;
    if(add_widget){
        bgp->addButton(new MyButton(this),num);
    }
    bgp->button(num)->setMinimumSize(,);
    bgp->button(num)->setMaximumSize(,);
    add_widget=false;
    for(int i=;i<num+;i++){
    layout->addWidget(bgp->button(i),i/,i%);
    }
    bgp->button(num-)->setEnabled(false);
    connect(bgp->button(num),SIGNAL(pressed()),this,SLOT(OnClicked()));
}

void MainWindow::test(){

    for(int i=;i<num;i++){
        Mat frame;
        cap[i]>>frame;
        if(frame.empty()){
            bgp->button(i)->setToolTip("攝像頭沒有連接配接!");
            bgp->button(i)->setText("攝像頭沒有連接配接!");
            break;
        }
        cvtColor(frame,frame,CV_BGR2RGB);

        QImage image(frame.data,frame.cols,frame.rows,QImage::Format_RGB888);
        char file[];
        sprintf_s(file,"%d%s",i,".jpg");
        image.save(file,"jpg");
        QPixmap dst(file);
        QPixmap pix=dst.scaled(QSize(,),Qt::IgnoreAspectRatio);

        QPalette p;
        p.setBrush(QPalette::Button,QBrush(pix));
        bgp->button(i)->setPalette(p);

    }

}
           

至此,多攝像頭的顯示就完成了,接下來要開始下一步的工作,大家加油。