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

    运行结果

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

    录屏
    截图

    微信公众号:
    微信公众号

  • 相关阅读:
    进程通信
    我(撞破南墙)的部分文章索引
    我(撞破南墙)参加"博客无双"的文章以及参加的原因(2010年12月05日update)
    MVC3RAZOR尝鲜2细说实用的WebGrid
    MVC3RAZOR尝鲜之漂亮的chart图表
    ASP.NETMVC3RC的一些新特性 (2010.11.9发布版)
    MVC3RAZOR尝鲜1
    Silverlight应用开发2webcam自拍保存和"录像"
    C#功能派的进阶你该思考的一些事1
    MVC3Razor简单文件操作
  • 原文地址:https://www.cnblogs.com/fensnote/p/13436435.html
Copyright © 2011-2022 走看看