OpenCV+多线程视频采集(一)

一、在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值