先上效果图,文章会分享源码哦
基本思路:先把四个视频的图像凭借到一个上,然后利用QTimer的信号设置到一定时间后就进行图片的更新
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <QImage>
#include <QTimer>
using namespace std;
using namespace cv;
namespace Ui {
class MainWidget;
}
class MainWidget : public QWidget
{
Q_OBJECT
public:
explicit MainWidget(QWidget *parent = nullptr);
~MainWidget();
void Draw_rectangle(Mat img,Point pt1, Point pt2);
private:
Ui::MainWidget *ui;
VideoCapture capture1;
VideoCapture capture2;
VideoCapture capture3;
VideoCapture capture4;
QTimer *timer;
public slots:
void on_timer_timeout();
};
#endif // MAINWIDGET_H
#include "MainWidget.h"
#include "ui_MainWidget.h"
MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget)
{
this->timer=new QTimer(this);
ui->setupUi(this);
connect(this->timer,SIGNAL(timeout()),this,SLOT(on_timer_timeout()));
this->capture1.open("/home/test/qt-workspace/opencv_view1/dm.mp4");
this->capture2.open("/home/test/qt-workspace/opencv_view1/carMove.mp4");
this->capture3.open("/home/test/qt-workspace/opencv_view1/carMove2.mp4");
this->capture4.open("/home/test/qt-workspace/opencv_view1/1.avi");
capture1.set(CV_CAP_PROP_FRAME_WIDTH, 320);
capture1.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
capture2.set(CV_CAP_PROP_FRAME_WIDTH, 320);
capture2.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
capture3.set(CV_CAP_PROP_FRAME_WIDTH, 320);
capture3.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
capture4.set(CV_CAP_PROP_FRAME_WIDTH, 320);
capture4.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
if(!capture1.isOpened())
{
std::cout<<"capture1 error"<<endl;
}
if(!capture2.isOpened())
{
std::cout<<"capture2 error"<<endl;
}
if(!capture3.isOpened())
{
std::cout<<"capture3 error"<<endl;
}
if(!capture4.isOpened())
{
std::cout<<"capture4 error"<<endl;
}
this->timer->start(30);
}
MainWidget::~MainWidget()
{
delete ui;
}
void MainWidget::Draw_rectangle(Mat img, Point pt1, Point pt2)
{
rectangle(img, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0);
}
void MainWidget::on_timer_timeout()
{
Mat frame1, frame2,frame3,frame4,ROIImage1, ROIImage2,mask1,mask2,gray_Image1, gray_Image2;
Mat ROIImage3, ROIImage4,mask3,mask4,gray_Image3, gray_Image4;
Mat frame5(480,640,CV_8UC3,Scalar(0,0,0));
capture1 >> frame1;
capture2 >> frame2;
capture3 >> frame3;
capture4 >> frame4;
cv::resize(frame1,frame1,Size(320,240));
cv::resize(frame2,frame2,Size(320,240));
cv::resize(frame3,frame3,Size(320,240));
cv::resize(frame4,frame4,Size(320,240));
Draw_rectangle(frame1, Point(0,0),Point(frame1.cols, frame1.rows));
Draw_rectangle(frame2, Point(0, 0), Point(frame2.cols, frame2.rows));
Draw_rectangle(frame3, Point(0, 0), Point(frame3.cols, frame3.rows));
Draw_rectangle(frame4, Point(0, 0), Point(frame4.cols, frame4.rows));
//sprintf(temp_1, "capture1");
//putText(frame1, temp_1, Point(frame1.cols / 16, frame1.rows / 10), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(255, 0, 255));
//sprintf(temp_2, "capture2");
//putText(frame2, temp_2, Point(frame2.cols / 16, frame2.rows / 10), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(255, 0, 255));
ROIImage1 = frame5(Rect(0,0,320,240));
ROIImage2 = frame5(Rect(320, 0, 320, 240));
ROIImage3 = frame5(Rect(0,240,320,240));
ROIImage4 = frame5(Rect(320,240,320,240));
//imshow("【ROIImage1】", ROIImage1);
//imshow("【ROIImage2】", ROIImage2);
cvtColor(frame1, gray_Image1,CV_RGB2GRAY);
cvtColor(frame2, gray_Image2, CV_RGB2GRAY);
cvtColor(frame3, gray_Image3, CV_RGB2GRAY);
cvtColor(frame4, gray_Image4, CV_RGB2GRAY);
mask1 = gray_Image1;
mask2 = gray_Image2;
mask3 = gray_Image3;
mask4 = gray_Image4;
frame1.copyTo(ROIImage1, mask1);
frame2.copyTo(ROIImage2, mask2);
frame3.copyTo(ROIImage3, mask3);
frame4.copyTo(ROIImage4, mask4);
cvtColor(frame5,frame5,CV_BGR2RGB);
QImage disimage=QImage(frame5.data,frame5.cols,frame5.rows,QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(disimage.scaled(ui->label->size(),Qt::KeepAspectRatio)));
}