可视化推理预测系统功能简介参看: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、程序启动的画面图像文件
#读取资源图像
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) #自适应大小
注意:有时会因为图像格式问题,显示出来的图像会变形不全,这里就要使用重载修复图像显示变形问题。
显示图像
三、预览/预测功能没有选择任务模型就是预览,否则就是根据选择的任务模型预测
#打开输入数据类型
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)
猫狗分类预测
四、拍照、录制功能
#开启拍照或录制
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])
)
注:这里要注意保存录像的文件名命名格式,避免文件名重置。
,