以下分模块对代码进行解析
发布时间:2025-06-24 19:51:51 作者:北方职教升学中心 阅读量:406
多线程与信号槽
在本项目中,多线程通过信号与槽实现以下功能:
- 更新主界面状态:线程的运行状态(如启动和停止)通过
RuningState
信号通知主线程。voidMainWindow::on_btn_Start_Stop_clicked(){m_Threadrun ?mthread->stop():mthread->start();// 根据当前状态启动或停止线程}
3. 文件选择
QFileDialog
被用来让用户选择视频或图像文件,并将这些参数传递到线程处理。
1. 核心线程逻辑
线程的运行逻辑集中在 run()
方法中。代码实现了视频解码、
voidmThread::run(){m_isRun =true;emit RuningState(true);// 通知主线程:线程开始运行emit infors(tc("线程启动"));switch(getFunId()){case0:anayVideo();// 处理视频break;case1:anayImages();// 处理图片break;default:break;}emit RuningState(false);// 通知主线程:线程结束运行emit infors(tc("线程退出"));}
2. 视频处理
在 anayVideo()
中,使用 OpenCV 的 VideoCapture
解码视频逐帧处理。二维码检测实现
1. 使用 OpenCV 进行检测
在 delectDecoded()
方法中,利用 OpenCV 的 QRCodeDetector
类进行二维码检测和解码,并将结果绘制到图像中。
QRCodeDetector
进行二维码检测。intmThread::delectDecoded(cv::Mat &image,QString &code){cv::Mat bbox,rectifiedImage;std::string data =qrDecoder.detectAndDecode(image,bbox,rectifiedImage);if(data.length()>0){code =QString::fromStdString(data);// 将结果返回std::vector<cv::Point>points;for(inti =0;i <bbox.cols;i++){points.push_back(cv::Point(static_cast<int>(bbox.at<cv::Point2f>(0,i).x),static_cast<int>(bbox.at<cv::Point2f>(0,i).y)));}for(size_t i =0;i <points.size();i++){cv::line(image,points[i],points[(i +1)%points.size()],cv::Scalar(0,255,0),3);// 绘制绿色边框}intminY =points[0].y;for(constauto&point :points){minY =std::min(minY,point.y);}cv::putText(image,data,cv::Point(points[0].x,minY -10),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,255,0),2);// 显示二维码信息}else{code =tc("未检测到二维码!");}return0;}
2. Mat 转 QImage
为了在 Qt 界面中显示 OpenCV 的图像,MatToQImage()
将 OpenCV 的 cv::Mat
转换为 Qt 的 QImage
。其主要功能包括:
- 根据功能 ID 分别处理视频或图片。
五、
voidMainWindow::on_btn_Loadfile_clicked(){QString fileName =QFileDialog::getOpenFileName(nullptr,tc("选择视频文件"),"",tc("视频文件(*.mp4)"));mthread->setFunId(0);// 设置功能 ID:0 表示处理视频if(!fileName.isEmpty())mthread->setThreadParams(fileName);// 传递参数到线程}voidMainWindow::on_btn_Loadimages_clicked(){QStringList fileNames =QFileDialog::getOpenFileNames(nullptr,tc("选择图像文件"),"",tc("图片文件(*.jpg *.bmp *.png)"));mthread->setFunId(1);// 设置功能 ID:1 表示处理图片if(!fileNames.isEmpty())mthread->setThreadParams(fileNames);}
三、
一、工作线程实现
mThread
类继承自QThread
,用于处理耗时的二维码检测任务。多线程处理和界面更新等功能,是一个典型的跨线程图像处理项目。初始化和用户交互。 - 通过信号将处理后的图像和数据传递回主线程。
connect(mthread,&mThread::imageProcessed,this,&MainWindow::processImage);voidMainWindow::processImage(constQImage &image,constQString &msg){ui->lab_disp->setPixmap(QPixmap::fromImage(image).scaled(image.width()/2,image.height()/2));// 显示缩放后的图像ui->lab_disData->setText(msg);// 显示检测到的信息}