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


微信公众号:

使用opencv在Qt控件上播放mp4文件的更多相关文章
- Cocos2dx 把 glview 渲染到 Qt 控件上(Mac 环境)
		本文原链接:http://www.cnblogs.com/zouzf/p/4423256.html 环境:Mac 10.9.2 Xcode5.1.1 Qt5.3 cocos2dx-2.2.4 ... 
- upload控件上传json文件合并的两种方法
		方法一: byte[] byte1 = FileUpload1.FileBytes; byte[] byte2 = FileUpload2.FileBytes; byte[] a1 = Encodin ... 
- Asp.net 使用Neatupload 第三方控件上传大文件,在IIS7上无法正常工作解决
		使用环境:Window Server2008 + IIS7 更改web.config配置 1.在<configSections></configSections>节内加入: & ... 
- asp:FileUpload 控件上传多文件
		<asp:FileUpload runat="server" ID="imgUpload" AllowMultiple="true" ... 
- 一个显示 OpenCV Mat 图像的自定义 Qt 控件
		今天学习 Qt 的时候顺手写了一个,包含一个头文件 qcvdisplay.h 和一个源文件 qcvdisplay.cpp,因为这是 qt 默认的文件命名方式,在 Qt Designer 中提升控件时会 ... 
- Qt判断鼠标在控件上
		QT判断鼠标是否在某子窗口控件上方 需要注意的是,子窗口获取geometry,是相对于父窗口的相对位置,QCursor::pos()获取的是鼠标绝对位置,要不将父窗口的相对位置进行换算,要不将鼠标的绝 ... 
- 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置
		用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ... 
- Qt中,将以png为格式的图片在按钮控件上显示
		在Qt编程中,我们常常会遇见这样或那样的小问题,这里,我介绍一个将png为格式的图片在按钮控件上显示的小功能. resistanceBtn = new QPushButton(element); re ... 
- MVC项目使用easyui的filebox控件上传文件
		开发环境:WIN10+IE11,浏览器请使用IE10或以上版本 开发技术框架MVC4+JQuery Easyui+knockoutjs 效果为弹出小窗体,如下图 1.前端cshtml文件代码(只包含文 ... 
随机推荐
- sass-loader安装+Failed to resolve loader: sass-loader You may need to install it.解决方法
			方式一: 通过 cnpm 安装node-sass cnpm install node-sass --save 方式二: 通过npm 安装 1.安装sass-loader npm install sas ... 
- Python模块01/自定义模块/time模块/datetime模块/random模块
			Python模块01/自定义模块/time模块/datetime模块/random模块 内容大纲 1.自定义模块 2.time模块 3.datetime模块 4.random模块 1.自定义模块 1. ... 
- CSS文本控制
			CSS文本控制 文本基础设置 字体设置 font-family可定义多个字体,系统会以从左至右的顺序进行查找,如左侧字体不存在,就往右侧找. 为什么要这么做呢?如果你只用了一种字体,而恰好人家电脑上没 ... 
- HotSpot的对象模型(5)
			Java对象通过Oop来表示.Oop指的是 Ordinary Object Pointer(普通对象指针).在 Java 创建对象实例的时候创建,用于表示对象的实例信息.也就是说,在 Java 应用程 ... 
- bzoj3622已经没有什么好害怕的了
			bzoj3622已经没有什么好害怕的了 题意: 给n个数Ai,n个数Bi,将Ai中的数与Bi中的数配对,求配对Ai比Bi大的比Bi比Ai大的恰好有k组的方案数.n,k≤2000 题解: 蒟蒻太弱了只能 ... 
- 问题:win10缺少一个或多个网络协议
			国庆回家,家里电脑连不上网了,诊断给出的结果是“缺少一个或多个网络协议” 网上这类问题提问的不少,回答的方法也是各种各样,一个一个试下来,发现这个方法是可行的. 1.打开设置--网络和Internet ... 
- 主席树铺垫——总区间第k小
			题目描述(口糊) 先给定一个长度为n的数列,然后给m次操作,每次输入b,求第b小的数. 样例输入 5 7 4 10 9 23 5 1 2 3 4 5 样例输出 4 7 9 10 23 数据范围及温馨提 ... 
- ES6语法——let和const
			一.let 1.定义 ES6新增了let命令,用来声明变量,用法类似于var,但是和var有一定的区别 2.let只在块级作用域内有效 首先来看一个比较简单的例子,请告诉我,他们分别输出什么 //代码 ... 
- 从一次故障聊聊前端 UI 自动化测试
			背景 事件的起因在于老板最近的两次"故障",一次去年的,一次最近.共同原因都是脚手架在发布平台发布打包时出错,导致线上应用白屏不可用. 最神奇的是,事后多次 Code Review ... 
- Markdown与LaTex使用语法整合
			Markdown学习 RUNOOB 简介 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gr ... 
 
			
		