上個文章就說了,我正在實作一個智能監控系統。
由此實作了Qt的FTP檔案傳輸:http://blog.csdn.net/u013812682/article/details/52199502。
還有Qt的tcp視訊傳輸:http://blog.csdn.net/u013812682/article/details/52185540。
在此我将實作基于Qt和opencv的基于多攝像頭的視訊顯示。
下一步将是整個系統的智能化操作,可能包括人臉檢測,人臉識别,單攝像頭人物追蹤(也可能是多攝像頭)以及還沒想到的其他功能。
最後将視訊或圖檔上傳雲伺服器
PS:隻有一個usb攝像頭加上筆記本攝像頭測試的,沒有懸挂的攝像頭有點心累呀!!!
整個顯示架構包括了兩個類,一個是自定義的按鈕類,一個是主界面顯示的類;
開始也糾結了好久,多線程這樣的,發現沒有其實也是可以實作的。
有圖有真相:
開始隻有一個按鈕:

點選一次就很生成一個新按鈕,并且加載一次攝像頭,
有多少攝像頭就可以點選幾次,我設定了最大值是九個,友善檢視(畢竟螢幕大小有限)
上代碼了:
自定義的按鈕:
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);
}
}
至此,多攝像頭的顯示就完成了,接下來要開始下一步的工作,大家加油。