可视化推理预测系统功能简介参看:48.1.基于Python PyQt5的可视化推理预测系统

界面设计参看:48.2.PyQt5的可视化推理预测系统——UI设计

一、资源文件的读取和释放

有两个资源文件:

1、OpenCV的人脸级联分类器xml文件:haarcascade_frontalface_alt.xml,用来检测人脸,文件也比较小,所以当成资源文件打包,运行程序,自动释放资源文件。

#释放资源文件 if not os.path.exists("haarcascade_frontalface_alt.xml"): QtCore.QFile.copy(":harr/haarcascade_frontalface_alt.xml","haarcascade_frontalface_alt.xml")

2、程序启动的画面图像文件

pyqt可视化编程(48.3.PyQt的可视化推理预测系统)(1)

#读取资源图像 splash = QtWidgets.QSplashScreen(QtGui.QPixmap(':img/start.jpg')) splash.show()

二、窗体上显示图像或视频画面

#在lable上显示图像 def imgshow(self,frame,lbl): #img=QtGui.QImage(frame.data,frame.shape[1],frame.shape[0],QtGui.QImage.Format_BGR888) #重载修复图像显示变形问题 img = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[1] * 3,QtGui.QImage.Format_BGR888) #按比例缩放 if self.isscaled: lbl.setPixmap(QtGui.QPixmap.fromImage(img).scaled(480, 480, QtCore.Qt.KeepAspectRatio)) else: lbl.setPixmap(QtGui.QPixmap.fromImage(img)) lbl.setScaledContents(True) #自适应大小

注意:有时会因为图像格式问题,显示出来的图像会变形不全,这里就要使用重载修复图像显示变形问题。

pyqt可视化编程(48.3.PyQt的可视化推理预测系统)(2)

显示图像

三、预览/预测功能

没有选择任务模型就是预览,否则就是根据选择的任务模型预测

#打开输入数据类型 def Open(self): self.Close() self.isstop=False self.isscaled=self.cboxscaled.isChecked() #获取选项按钮状态 self.iscam=self.rbtcam.isChecked() self.isimg=self.rbtimg.isChecked() self.isvideo=self.rbtvideo.isChecked() self.isipcam=self.rbtipcam.isChecked() taskid=self.cboxtask.currentIndex() task=self.cboxtask.currentText() model_dir=os.path.join("models",self.cboxtask.currentText(),self.cboxmodel.currentText(),"inference_model") #print(model_dir) #图像缩放 self.isscaled=self.cboxscaled.isChecked() if taskid==0:#预览 if self.isimg: self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '选择','', "图像文件(*.jpg *.png)") if self.fileName!="": frame=cv2.imread(self.fileName) self.imgshow(frame,self.lblsrc) else: self.Display() else:#预测 if self.iscam or self.isipcam: if task in ["face-model"] : self.cls_videodetect(model_dir,isface=True) if task in ["cls-model"]: self.cls_videodetect(model_dir,isface=False) if task in ["det-model"]: self.det_videodetect(model_dir) if self.isimg: self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '选择','', "图像文件(*.jpg *.png)") if self.fileName!="": frame=cv2.imread(self.fileName) self.imgshow(frame,self.lblsrc) #print(task) if task in ["face-model"]:#调用图像分类-人脸检测与识别任务,结果显示在dst上 self.cls_imgpredict(model_dir,self.fileName,isface=True)#预测返回结果 if task in ["cls-model"]: #调用图像分类-猫狗分类 self.cls_imgpredict(model_dir,self.fileName,isface=False)#预测返回结果 if task in ["det-model"]:#调用目标检测-人头检测 self.det_imgpredict(model_dir,self.fileName) if self.isvideo: self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '选择视频文件','', '*.mp4') if self.fileName!="": if task in ["face-model"] : self.cls_videodetect(model_dir,self.fileName,isface=True) if task in ["cls-model"]: self.cls_videodetect(model_dir,self.fileName,isface=False) if task in ["det-model"]: self.det_videodetect(model_dir,self.fileName)

pyqt可视化编程(48.3.PyQt的可视化推理预测系统)(3)

猫狗分类预测

四、拍照、录制功能

#开启拍照或录制 def snap(self): if self.cap.isOpened(): self.issnap=True def rec(self): if self.cap.isOpened(): self.isrec =not self.isrec if self.isrec: #创建video writer ret,frame=self.cap.read() self.createVideo(frame) self.btnrec.setText("停止录制") self.statusBar().showMessage("文件录制中…………\n") else: self.video.release() #释放video writer self.btnrec.setText("开始录制") self.statusBar().showMessage("文件保存在output目录里\n") #摄像头或监控拍照 def imgsave(self,frame): if self.rbtcam.isChecked() or self.rbtipcam.isChecked(): fname=datetime.datetime.now().strftime("%Y%m%d%H%M%S") ".jpg" if not os.path.exists("output"): os.makedirs("output") cv2.imwrite(os.path.join("output",fname),frame) self.statusBar().showMessage(fname "文件保存在output目录里\n") self.issnap=False #摄像头或监控录制 def createVideo(self,frame): if self.rbtcam.isChecked() or self.rbtipcam.isChecked(): fname=datetime.datetime.now().strftime("%Y%m%d%H%M%S") ".mp4" if not os.path.exists("output"): os.makedirs("output") self.video=cv2.VideoWriter( filename=os.path.join("output",fname), fourcc=cv2.VideoWriter_fourcc(*"mp4v"), fps=15, frameSize=(frame.shape[1],frame.shape[0]) )

注:这里要注意保存录像的文件名命名格式,避免文件名重置。

,