一、在Qt中创建名一个为MultithreadedCV的示例;将OpenCV框架添加到本项目中
include(./OpenCV/opencv.pri)
SOURCES += \
main.cpp \
mainwindow.cpp \
videoprocessorthread.cpp \
HEADERS += \
mainwindow.h \
videoprocessorthread.h \
FORMS += \
mainwindow.ui
二、在mainwindow.ui文件中添加两个QLabel,分别命名为:inVideo和outVideo;
三、创建名为VideoProcessorThread的新类,该类继承Qthread,如下所示:
1、videoprocessorthread.h
#ifndef VIDEOPROCESSORTHREAD_H
#define VIDEOPROCESSORTHREAD_H
#include <QObject>
#include <QThread>
#include <opencv2/opencv.hpp>
#include <QPixmap>
#include <QImage>
class VideoProcessorThread : public QThread
{
Q_OBJECT
public:
explicit VideoProcessorThread(QObject *parent = nullptr);
signals:
void inDisplay(QPixmap pixmap);
void outDisplay(QPixmap pixmap);
private:
void run() override;
};
#endif // VIDEOPROCESSORTHREAD_H
2、videoprocessorthread.cpp
#include "videoprocessorthread.h"
VideoProcessorThread::VideoProcessorThread(QObject *parent)
: QThread(parent)
{
}
void VideoProcessorThread::run()
{
using namespace cv;
VideoCapture camera(0);
Mat inFrame, outFrame;
while (camera.isOpened() && !isInterruptionRequested()) {
camera >> inFrame;
if(inFrame.empty())
continue;
bitwise_not(inFrame,outFrame);
emit inDisplay(
QPixmap::fromImage(
QImage(inFrame.data,
inFrame.cols,
inFrame.rows,
static_cast<int>(inFrame.step),
QImage::Format_RGB888).rgbSwapped()));
emit outDisplay(
QPixmap::fromImage(
QImage(outFrame.data,
outFrame.cols,
outFrame.rows,
static_cast<int>(outFrame.step),
QImage::Format_RGB888).rgbSwapped()));
}
}
四、在MainWindow构造函数中,放在setupUi代码之后:
connect(&processor,SIGNAL(inDisplay(QPixmap)),ui->inVideo,SLOT(setPixmap(QPixmap)));
connect(&processor,SIGNAL(outDisplay(QPixmap)),ui->outVideo,SLOT(setPixmap(QPixmap)));
processor.start();
五、在MainWinodw析构函数中,放在deleteui代码之前:
processor.requestInterruption();
processor.wait();
总结:此示例主要是两个目的,一是多线程,二是验证opencv算法bitwise_not。