OpenCV在Qt中显示视频的两种方法

4 篇文章 0 订阅

参考:http://blog.csdn.net/augusdi/article/details/8865541

代码如下:

注意,要在ui界面上放置一个“Vertical Layout”控件,调整到合适大小

#include <QtWidgets/QMainWindow>
#include <QPaintEvent>
#include <QTimer>
#include <QPainter>
#include <QPixmap>
#include <QLabel>
#include <QImage>
#include <opencv.hpp>
#include "ui_mainwindow.h"
using namespace cv;
class mainwindow : public QMainWindow
{
	Q_OBJECT

public:
	mainwindow(QWidget *parent = 0);
	~mainwindow();
public slots:
	void updateImage();
private:

	QTimer theTimer;
	Mat srcImage;
	VideoCapture videoCap;
	QLabel *imageLabel;

	Ui::mainwindowClass ui;

protected:
	void paintEvent(QPaintEvent *e);
};
mainwindow::mainwindow(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	connect(&theTimer, &QTimer::timeout, this, &mainwindow::updateImage);
	//从摄像头捕获视频
	if(videoCap.open(0))
	{
		srcImage = Mat::zeros(videoCap.get(CV_CAP_PROP_FRAME_HEIGHT), videoCap.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
		theTimer.start(33);
	}
	//设置显示视频用的Label
	imageLabel = new QLabel(this);
	ui.verticalLayout->addWidget(imageLabel);
}

mainwindow::~mainwindow()
{
	
}

void mainwindow::paintEvent(QPaintEvent *e)
{
	//显示方法一
	QPainter painter(this);
	QImage image1 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
	painter.drawImage(QPoint(20,20), image1);
	//显示方法二
	QImage image2 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
	imageLabel->setPixmap(QPixmap::fromImage(image2));
	imageLabel->resize(image2.size());
	imageLabel->show();
}

void mainwindow::updateImage()
{
	videoCap>>srcImage;
	if(srcImage.data)
	{
		cvtColor(srcImage, srcImage, CV_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR
		this->update();	//发送刷新消息
	}
}

演示结果



  • 9
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1、安装qt sdk 我装的是qt 5.3 msvc版32位,内置了qt creator,直接用windows带的msvc编译器。 2.安装opencv 我装的是opencv2.4.9 for windows,解压到D盘根目录下了。 注意opencv for windows解压后就有个build文件夹,说明是用msvc编译器编译好的,我们的qt用的是msvc编译器的话就可以直接导入链接库和头文件了,不需要网上那些人所说的要搞minGW和cmake编译,如果你装的qt是minGW版的就需要用cmake重新编译一遍opencv,相关教程一搜一大把。 3.在qt creator建一个标准的控制台C++工程项目。 随便建哪种项目都是可以的,这里为了方便直接建立最简单的C++控制台项目。 4.配置opencv的环境变量(此步貌似可省,但是配个环境变量总是保险的) 在另一篇博客里讲过http://blog.csdn.net/u012234115/article/details/38612977 5.修改工程的pro文件。 要包含头文件目录和静态连接库目录,在里面加入 INCLUDEPATH+=d:/opencv/build/include/opencv \ d:/opencv/build/include/opencv2 \ d:/opencv/build/include LIBS+=D:\opencv\build\x86\vc12\lib\opencv_ml249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_calib3d249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_contrib249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_core249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_features2d249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_flann249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_gpu249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_highgui249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_imgproc249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_legacy249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_objdetect249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_ts249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_video249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_nonfree249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_ocl249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_photo249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_stitching249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_superres249d.lib LIBS+=D:\opencv\build\x86\vc12\lib\opencv_videostab249d.lib 以上加入的是debug版本的库,如果要release版本的就把后面的d去掉。其/和\这两种斜杠都可以表示路径,但是不同路径换行分隔必须用\,INCLUDEPATH和LIBS等都可以一次加多条或者一次加一条,注意格式 加完了注意要qmake一下。
在使用OpenCVQt进行多线程视频处理时,通常会定义一个继承自QObject的类,并在其实现视频处理的功能。该类可以包含多个方法和成员变量来处理视频流。 引用是一个名为videoProcessorThread的类的定义,该类继承自QThread,并包含了一些用于视频处理的方法和信号槽。其,showCamera()方法用于显示摄像头的图像,stopVideo()方法用于停止视频的播放。 引用是另一个名为VideoProcessor的类的定义,该类同样继承自QObject,并包含了showCamera()方法和一些信号槽。不同的是,该类使用了OpenCV的VideoCapture来处理视频流。 引用是一个名为CamThread的类的定义,该类同样继承自QObject,并包含了一些方法和信号槽来处理视频。该类方法包括openCamera()、closeCamera()、startsave()等,用于打开摄像头、关闭摄像头、保存视频等操作。 综上所述,在使用OpenCVQt进行多线程处理视频时,可以定义一个继承自QObject的类,并在其实现视频处理的功能。可以根据具体需求选择适合的类和方法来处理视频流。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [用QThread及QObject的movetothread两种多线程方法实现在QT控件上播放opencv视频](https://blog.csdn.net/jellocomeon/article/details/104197167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Qt5.7 + OpenCV3.2开启多线程调用系统摄像头并实现视频录制与回放、图片截取与保存(三)多线程实现](https://blog.csdn.net/qq_34578785/article/details/105990410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值