使用opencv在Qt控件上播放mp4文件

时间:2021-02-26 16:37:38

简介

opencv是一个开源计算机视觉库,功能非常多,这里简单介绍一下OpenCV解码播放Mp4文件,并将图像显示到Qt的QLabel上面。

核心代码

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QTimer>
#include "opencv2/opencv.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp> using namespace std;
using namespace cv; namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void InitVideo(); private slots:
void on_play_clicked();
void playTimer(); void on_stop_clicked(); private:
Ui::MainWindow *ui;
QTimer *m_pTimer;
VideoCapture *m_pVideo;
}; #endif // MAINWINDOW_H

实现代码

这里需要注意的一点,Qt上显示图像的格式和OpenCV读取的数据格式不一样,需要转换一下:

cv::cvtColor(frame, frame, COLOR_BGR2RGB);//图像格式转换

QImage disImage = QImage((const unsigned char*)(frame.data),frame.cols,frame.rows,frame.cols*frame.channels(),QImage::Format_RGB888);

ui->label->setPixmap(QPixmap::fromImage(disImage));//显示图像

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
using namespace cv;
using namespace std; MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pTimer = new QTimer;
m_pTimer->setInterval(30); //定时30毫秒读取一帧数据
connect(m_pTimer, &QTimer::timeout, this, &MainWindow::playTimer); ui->play->setEnabled(true);
ui->stop->setEnabled(false); InitVideo();
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::playTimer()
{
Mat frame; //从cap中读取一帧数据,存到fram中
*m_pVideo >> frame;
if ( frame.empty() )
{
return;
}
cv::cvtColor(frame, frame, COLOR_BGR2RGB);//图像格式转换
QImage disImage = QImage((const unsigned char*)(frame.data),frame.cols,frame.rows,frame.cols*frame.channels(),QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(disImage));//显示图像
} void MainWindow::InitVideo()
{
m_pVideo = new VideoCapture("test.mp4"); } void MainWindow::on_play_clicked()
{
m_pTimer->start();
ui->play->setEnabled(false);
ui->stop->setEnabled(true); } void MainWindow::on_stop_clicked()
{
ui->play->setEnabled(true);
ui->stop->setEnabled(false); m_pTimer->stop();
}

控件

用于测试,界面比较简单,中间是一个QLabel,下面两个按键用于控制播放。

使用opencv在Qt控件上播放mp4文件

运行结果

录屏工具效果不太好,实际上是很清晰的。

使用opencv在Qt控件上播放mp4文件

使用opencv在Qt控件上播放mp4文件

微信公众号:

使用opencv在Qt控件上播放mp4文件