QT6.5.3 Mingw11.2 opencv在label打开视频并转灰度

这段代码主要实现了在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

养牛大人

感谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值