按下打开视频利用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();
}