main.cpp
#include "QTvision.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTvision w; w.show(); //w.setWindowTitle("running"); 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::on_comboBox_currentIndexChanged() //whether the camera import or not { if (ui.comboBox->currentIndex()) // currentIndex是QComboBox 中的一个成员函数,用于获取当前选中项的索引 isCamera = 1; //开启摄像头的 else isCamera = 0; } void QTvision::importFrame() { //int width = 3000; //int height = 1800; //因为分辨率调高了很多,所以帧率会降低很多 //capture.set(cv::CAP_PROP_FRAME_WIDTH, width); //调整capture相机的分辨率 //capture.set(cv::CAP_PROP_FRAME_HEIGHT, height); capture >> frame; //从视频源获取一帧,并存到frame里 //------------相机的话亮度高点,视频的话不操作 if (isCamera == 1) // { frame.convertTo(frame, -1, 5, 0); // 将亮度增加 3000%(可以根据需要调整参数) }else {} 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->resize(srcQImage.size()); //调整 ui.label 控件的大小以适应图像大小。 ui.label->show(); //显示标签 } void QTvision::on_displayButton_clicked() //播放按钮 { if (isCamera) //如果是1,true,则开启相机 { capture.open(0); } else { capture.open("C:/Users/Desktop/test.mp4"); //播放视频 } timer->start(33); //启动定时器,时间间隔为33ms,就是每隔33ms,发出一个timeout信号,与signal联系,那么帧率则是1000/33≈30帧 } void QTvision::on_buttond_clicked() //大播放,帧率100帧 { capture.open(0); timer->start(10); } 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 <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 bool isCamera = 0; //相机选择清零 private slots: void on_comboBox_currentIndexChanged(); //下拉框选择 void importFrame(); void on_displayButton_clicked(); void on_stopButton_clicked(); void on_buttond_clicked(); };