简介
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,下面两个按键用于控制播放。
运行结果
录屏工具效果不太好,实际上是很清晰的。