opencv播放视频显示在qt的gui界面上

3 篇文章 0 订阅

按下打开视频利用opencv 的read函数将读取到的一帧一帧的图像显示在qt的gui界面上

线程类

利用信号将图片一帧一帧的传给gui界面

 

gui界面接收到线程发送过来的图片后利用重绘事件来更新画面 

接下来是源码哦

//线程类
#ifndef PLAYVIDEOTHREAD_H
#define PLAYVIDEOTHREAD_H

#include <QThread>
#include <opencv2/opencv.hpp>
#include <QDebug>
using namespace cv;

class playvideothread : public QThread
{
    Q_OBJECT
public:
    playvideothread(char *videopath);
    void run();
private:
    Mat image;
    VideoCapture cap;
signals:
    void sendFrame(Mat Frame);
};

#endif // PLAYVIDEOTHREAD_H

#include "playvideothread.h"

playvideothread::playvideothread(char *videopath)
{
    if(cap.open(videopath))
    {
        qDebug()<<"打开视频成功"<<endl;
    }
}

void playvideothread::run()
{
    while(cap.read(image))
    {
        emit sendFrame(image);
        msleep(40);
    }
}

//主界面
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include "playvideothread.h"

namespace Ui {
class MainWidget;
}

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent = nullptr);
    ~MainWidget();
    void paintEvent(QPaintEvent *event);

private slots:
    void on_pushButton_clicked(bool checked);
    void updateimage(Mat image);

private:
    Ui::MainWidget *ui;
    playvideothread *videothread;
    Mat image;
};

#endif // MAINWIDGET_H

#include "MainWidget.h"
#include "ui_MainWidget.h"

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::paintEvent(QPaintEvent *event)
{
    QImage qimage=QImage(this->image.data,this->image.cols,this->image.rows,QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(qimage));
    ui->label->setScaledContents(true);
}

void MainWidget::on_pushButton_clicked(bool checked)
{
    this->videothread=new playvideothread("carMove.mp4");
    connect(this->videothread,SIGNAL(sendFrame(Mat)),this,SLOT(updateimage(Mat)),Qt::BlockingQueuedConnection);
    this->videothread->start();
}

void MainWidget::updateimage(Mat image)
{
    this->image=image.clone();
    this->update();
}

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值