QT Mingw opencv在label打开视频并转灰度

摘要:#include "mainwindow.h"#include "ui_mainwindow.h"#include #include #include MainWindow::MainWindow(Q

测试环境qt6.5.3 opencv4.10编译器

界面添加一个pushButton和label控件

mainwindow.h 文件代码

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include #include QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow;}QT_END_NAMESPACEclass MainWindow : public QMainWindow{ Q_OBJECTpublic: 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 #include #include 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); } }}

可以在灰度与原色之间切换

来源:新手村养牛

相关推荐