本系列课程是使用Qt + OpenCV 在 Windows 平台实现视频播放器。
准备工作
1.1 安装 OpenCV
- 从OpenCV官网下载OpenCV 4.9
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 图像的示例。
- 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();
}
关键注意事项
- 线程安全:如果需要更高性能的实时处理,建议使用多线程将图像处理和 GUI 更新分离。
- 依赖库路径:运行时确保 OpenCV 库文件在可搜索路径中。
- 显示图像格式:OpenCV 默认使用 BGR 格式,而 Qt 使用 RGB 格式,注意在转换时调用
cvtColor
。