zoukankan      html  css  js  c++  java
  • 使用opencv在Qt控件上播放mp4文件

    简介

    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,下面两个按键用于控制播放。
    界面

    运行结果

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

    录屏
    截图

    微信公众号:
    微信公众号

  • 相关阅读:
    CART分类回归树算法
    决策分类树算法之ID3,C4.5算法系列
    break case
    Linux下创建C函数库
    邮件服务
    mysql 语句 GROUP_CONCAT
    python的__mro__与__slot__
    mod_wsgi 的两种模式
    看一看
    【转贴】Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
  • 原文地址:https://www.cnblogs.com/fensnote/p/13436435.html
Copyright © 2011-2022 走看看