这段代码主要实现了在Qt中使用OpenCV打开视频并在Label控件上显示,同时可以转换视频为灰度图。
1. 环境配置
代码在Qt 6.5.3和OpenCV 4.10的编译环境下运行。
2. 界面设计
主界面中添加了一个PushButton按钮和一个Label控件。
3. 功能实现
点击按钮可以打开视频文件,视频会在Label控件上显示,再次点击可以转换为灰度图。
头文件代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <opencv2/opencv.hpp>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void on_pushButton_clicked(); //按钮事件
void updateFrame(); //更新帧
private:
cv::VideoCapture cap;
QTimer *timer;
};
#endif // MAINWINDOW_H
主文件代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QImage>
#include <QPixmap>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建定时器
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::updateFrame);
}
MainWindow::~MainWindow()
{
if (cap.isOpened()) {
cap.release();
}
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
// 打开文件选择对话框
QString fileName = QFileDialog::getOpenFileName(this,
tr("选择视频文件"),
"",
tr("视频文件 (*.mp4 *.avi *.mov *.mkv)"));
if (!fileName.isEmpty()) {
// 如果已经在播放视频,先停止
if (cap.isOpened()) {
timer->stop();
cap.release();
}
// 打开新的视频文件
cap.open(fileName.toStdString());
if (cap.isOpened()) {
// 开始定时器,每30ms更新一帧
timer->start(30);
}
}
}
void MainWindow::updateFrame()
{
if (cap.isOpened()) {
cv::Mat frame;
cap.read(frame);
if (!frame.empty()) {
cv::Mat gray_frame;
// 转换为灰度图
// cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY);
// 打开原色视频 转换为RGB格式
cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2RGB);
// 转换为QImage
QImage qimg(gray_frame.data,
gray_frame.cols,
gray_frame.rows,
gray_frame.step,
QImage::Format_RGB888); //原色
// QImage::Format_Grayscale8); //灰度色
// 显示在label上,保持宽高比
ui->label->setPixmap(QPixmap::fromImage(qimg).scaled(
ui->label->size(),
Qt::KeepAspectRatio,
Qt::SmoothTransformation));
} else {
// 视频播放完毕,重新开始
cap.set(cv::CAP_PROP_POS_FRAMES, 0);
}
}
}
qt项目下载:https://wwrm.lanzoue.com/iY4YO2gykoxa