视频截图如下
使用一个单独的线程处理和显示视频源的输入帧和输出帧,有助于使GUI线程(主线程)保持空闲及可响应性,而用第二线程处理更密集的进程。
准备工作:
创建含两个label的QT控件应用程序,并在.pro文件中配置opencv:
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS += /usr/local/lib64/libopencv*
第一种方法(官方已不推荐的老方法):子类化QThread。 思路如下:
一,创建类继承Qthread: class videoProcessorThread : public QThread
重写run函数,作为新线程入口。run函数中1打开视频,2设定时时器延时读取视频帧,3给主框架发送显示帧图片消息,4加上this->exec();支持信号槽。
二,主框架MainWindow的构造函数中,1建立显示图片的信号槽连接,2启动线程。析构函数中3结束线程。
代码如下:
videoprocessorthread.h
#ifndef VIDEOPROCESSORTHREAD_H
#define VIDEOPROCESSORTHREAD_H
#include <QObject>
#include <QThread>
#include <QPixmap>
#include <opencv2/opencv.hpp>
using namespace cv;
class videoProcessorThread : public QThread
{
Q_OBJECT
public:
explicit videoProcessorThread(QObject *parent = nullptr);
void showCamera();
void stopVideo();
signals:
void inDisplay(QPixmap pixmap);
void outDisplay(QPixmap pixmap);
public slots:
private:
void run() override;
VideoCapture camera;
Mat inFrame,