上个文章就说了,我正在实现一个智能监控系统。
由此实现了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);
}
}
至此,多摄像头的显示就完成了,接下来要开始下一步的工作,大家加油。