用QThread及QObject的movetothread两种多线程方法实现在QT控件上播放opencv视频

本文介绍了如何在QT应用中利用QThread和QObject的movetothread方法实现多线程播放OpenCV视频,以保持GUI线程的响应性。首先,详细阐述了两种方法的实现思路:一是子类化QThread并重写run函数,二是使用QObject的movetothread。接着,提供了相关代码示例,包括线程类的定义、主框架中的信号槽连接以及线程的启动与结束处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 视频截图如下

使用一个单独的线程处理和显示视频源的输入帧和输出帧,有助于使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,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值