Qt + OpenCV 实现视频播放器(一)

本系列课程是使用Qt + OpenCV 在 Windows 平台实现视频播放器。

准备工作

1.1 安装 OpenCV

1.2 安装Qt

  • 下载并安装Qt开发环境,本教程使用Qt 5.15.2

1.3 配置开发环境

  • Windows:建议使用 Qt Creator 和 MSVC 编译器,本教程使用 MSVC 2019

配置项目文件

在 Qt 项目中,需要在.pro文件中添加 OpenCV 的库路径和依赖。
示例:修改.pro文件

# 添加 OpenCV 头文件路径
INCLUDEPATH += C:/opencv/build/include
DEPENDPATH += C:/opencv/build/include

# 添加 OpenCV 库
win32:CONFIG(release, debug|release): LIBS += -LC:/opencv/build/x64/vc16/lib/ -lopencv_world490
else:win32:CONFIG(debug, debug|release): LIBS += -LC:/opencv/build/x64/vc16/lib/ -lopencv_world490d

加载和显示图像示例

以下是如何在 Qt 中加载和显示 OpenCV 图像的示例。

  1. Qt + OpenCV 显示图像
#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QPixmap>
#include <opencv2/opencv.hpp>

using namespace cv;

QImage MatToQImage(const Mat& mat) {
	// 检测通道类型并转换
	if(mat.type() == CV_8UC1) {	// 灰度图像
		return QImage(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
	} else if (mat.type() == CV_8UC3) {
		Mat rgb;
		cvtColor(mat, rgb, COLOR_BGR2RGB);	// 转换为 RGB 格式
		return QImage(rgb.data, rgb.clos, rgb.rows, rgb.step, QImage::Format_RGB888);
	else {
		return QImage();	// 其他格式暂不支持
	}
}

int main(int argc, char *argv[]) 
{
	QApplication app(argc, argv);

	// 加载图像
	Mat image = imread("example.jpg");
	if(image.empty()) {
		qDebug() << "无法加载图像!";
		return -1;
	}
	// 转换为 QImage
	QImage qImage = MatToQImage(image);
	
	// 显示图像
	QLabel label;
	label.setPixmap(QPixmap::fromImage(qImage));
	label.resize(qImage.size());
	label.show();

	return app.exec();
}

实时显示视频

结合 OpenCV 和 Qt,可以实现实时视频流的显示。
示例代码:Qt 显示视频

#include <QApplication>
#include <QLabel>
#include <QTimer>
#include <QImage>
#include <QPixmap>
#include <opencv2/opencv.hpp>

using namespace cv;

QImage MatToQImage(const Mat& mat) {
	if(mat.type() == CV_8UC1) {
		return QImage(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
	} else if(mat.type() == CV_8UC3) {
		Mat rgb;
		cvtColor(mat, rgb, COLOR_BGR2RGB);
		return QImage(rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);
	} else {
		return QImage();
	}
}

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

	// 创建 QLabel 用于显示视频帧
	QLabel label;
	label.resize(640, 480);
	label.show();

	// 打开视频流(可以替换为文件路径)
	VideoCapture cap(0);		// 0 标识默认摄像头
	if(!cap.isOpened()) {
		qDebug() << "无法打开摄像头!";
		return -1;
	}

	// 使用 QTimer 定时获取帧
	QTimer timer;
	QObject::connect(&timer, &QTimer::timeout, [&](){
		Mat frame;
		cap >> frame; // 获取视频帧
		if(!frame.empty()) {
			QImage qImage = MatToQImage(frame);
			label.setPixmap(QPixmap::fromImage(qImage));	// 更新 QLabel 显示
		}
	)};
	timer.start(30);	// 每 30ms 更新一次

	return app.exec();
}

关键注意事项

  1. 线程安全:如果需要更高性能的实时处理,建议使用多线程将图像处理和 GUI 更新分离。
  2. 依赖库路径:运行时确保 OpenCV 库文件在可搜索路径中。
  3. 显示图像格式:OpenCV 默认使用 BGR 格式,而 Qt 使用 RGB 格式,注意在转换时调用 cvtColor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值