main.cpp
#include "QTvision.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTvision w; w.show(); return a.exec(); }
QTvision.cpp
#include "QTvision.h" #include "ui_QTvision.h" QTvision::QTvision(QWidget *parent) : QWidget(parent) { ui.setupUi(this); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(importFrame())); //连接定时器 timer 的 timeout() 信号与当前对象 this 的 importFrame() 槽函数 } void QTvision::importFrame() { capture >> frame; //从视频源获取一帧,并存到frame里 if (timer->remainingTime() > 30 ) {} //计时器间隔大于30ms的话就什么也不敢,小于30ms就亮度加点 else { frame.convertTo(frame, -1, 5, 0); // 将亮度增加 400%(可以根据需要调整参数) } cvtColor(frame, frame, CV_BGR2RGB);//only RGB of Qt //将从 capture 获取到的图像数据从 BGR 格式(mat)转换为 RGB 格式(qt) QImage srcQImage = QImage((uchar*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888);//将转换后的 RGB 图像数据创建为 Qt 的 QImage 对象 srcQImage。其中 (uchar*)(frame.data) 是将帧数据的指针转换为 uchar* 类型,用作 QImage 的数据源。 ui.label->setPixmap(QPixmap::fromImage(srcQImage)); //将 srcQImage 设置为 ui.label 的 pixmap,即在界面上显示图像。 ui.label->show(); //显示标签 } void QTvision::on_displayButton_clicked() //播放按钮 { capture.open(0); timer->start(20);//启动定时器,并设置定时器的时间间隔为20ms, //启动定时器,时间间隔33ms,就是每隔20ms,发出一个timeout信号,与signal联系,那么帧率则是1000/20≈50帧 } void QTvision::on_clickedButton_clicked() { //capture.open("C:/Users/Desktop/test.mp4"); timer->start(80); } void QTvision::on_stopButton_clicked() { timer->stop(); //定时器停止 capture.release(); //释放视频捕获对象 capture 的资源,关闭打开的视频文件或者摄像头,防止时间过长,卡顿 }
QTvision.h
#pragma once #include <QtWidgets/QWidget> #include "ui_QTvision.h" #include <opencv2\opencv.hpp> #include <QTimer> #include <QLabel> #include<QFileDialog> #include <QPixmap> #include <opencv2/xphoto.hpp> #pragma execution_character_set("utf-8")//运行字符编码要写这行,否则中文乱码 using namespace cv; class QTvision : public QWidget { Q_OBJECT public: QTvision(QWidget *parent = Q_NULLPTR); private: Ui::QTvision ui; //声明ui界面 VideoCapture capture; //声明一个名为capture的VideoCapture对象 QTimer *timer; //声明一个QTimer类型的指针 Mat frame; //声明一个mat类型的frame private slots: void importFrame(); void on_displayButton_clicked(); void on_stopButton_clicked(); void on_clickedButton_clicked(); };