【探索】用pyqt5给深度学习算法(SSD)搭建界面(GUI)

毕设的开题答辩上,被教授怼了工作量和实用性,于是指导老师让我们自己加一个GUI,苦于菜鸟一只,从来没有接触过,只能从0开始学习……还是以口罩佩戴识别代码为例子。
以此记录下自己的学习过程,也希望能给其他人带来一点帮助,如有帮助,点个小赞,谢谢~

思路参考

【1】需求:要实现视频流采集图像,然后将图像送入算法检测,再将检测结果绘制在采集到的图像,最后将图像在界面上显示出来,同时界面要控制上述流程。

【2】借鉴流程图
在这里插入图片描述

【3】绘制GUI界面
(1)准备工作:据说eric6是最理想的pyqt的IDE
使用anaconda+pyqt5+eric6
安装及配置: https://blog.csdn.net/weiaitaowang/article/details/52045360

更新pip时dor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='f 的解决办法:
1.管理员身份打开命令行
2.python -m pip install -U --force-reinstall pip

安装eric6报错
Sorry, please install QScintilla2 and
its PyQt5/PyQt4 wrapper.
Error: cannot import name ‘Qsci’
Press enter to continue…
解决方法:pip3 install QScintilla
pyqt和eric得快速上手参考教程
可以实现界面与逻辑分离

eric6 中 designer 无法启动的解决办法:安装缺少的 PyQt5 tools ,cmd 中:pip install PyQt5-tools
安装完后可以在目录下找到designer.exe我的是C:\Users\zwy\Anaconda3\Lib\site-packages\pyqt5_tools\Qt\bin
修改路径:设置>首选项>qt>qt工具>目录写到bin
可以成功打开


这里简单介绍下在这个项目中,我用到的控件:
A.用Qlabel显示图片参考教程
QLabel用于显示文本或图像,没有提供用户交互功能,本文主要是想用它来显示图像。
在这里插入图片描述

B.PushButton(各类按钮)
C.TextEdit(显示/提示文本)

(2)编程内容
现在ui文件已经绘制完成,我们要用eric将ui文件转化成.py文件:保存后关闭designer,右键点击ui文件,选择编译窗体,编译成功会有提示。返回源代码标签,会看见多了一个.py文件
在这里插入图片描述
双击该文件,可以看见窗体代码。

【突发状况】在被强制更新了windows之后,eric无法打开了(尝试了各种方法),退而求其次准备使用VS code 完成代码!!(正好电脑上有vs code……但其实应该试一下重装eric,毕竟vs code 环境还要重新调整,而且应该是没有eric构造槽函数方便——不想再用eric的原因。。可能是因为被气到了!)

幸好已经用eric将ui文件转化为.py文件,用vs code转换会有一些麻烦。
*1 功能1,点击按钮,打开文件选择界面,选择图片显示在lable上
a.定义事件函数:label_imgshow是我设置的label的subject名字
( self.label_imgshow.setText(_translate(“MainWindow”, “等待选择”)修改时换成你们自己设置的名字就可以

 def on_op1_img_clicked(self):      
 """        Slot documentation goes here.        """        
 # TODO: not implemented yet        
 # 打开文件对话框        
 	imgName, imgType = QFileDialog.getOpenFileName(None, '选择图片', './', '*.png;;*.jpg;;AllFile(*.*)', '')
	jpg = QtGui.QPixmap(imgName).scaled(self.label_imgshow.width(),self.label_imgshow.height())        
	self.label_imgshow.setPixmap(jpg)        

b.绑定事件:op1_img是我设置的选择图片的按钮subject名字;on_op1_img_clicked是事件名字
( self.op1_img.setText(_translate(“MainWindow”, “选择图片”)

self.op1_img.clicked.connect(self.on_op1_img_clicked)

记error:最初 QFileDialog.getOpenFileName(None,……的None我写的self,会有报错(TypeError: getOpenFileName…)
原因:参考
在这里插入图片描述

*2功能2,把SSD算法识别之后的结果绘画在label上
首先先理清思路。为了完成这个功能,我们有三个参数要跨文件进行通信。1.在界面程序中通过打开文件夹选择图片获取了图片路径,我们需要把这个路径传递给算法程序。2.并且如上图所示我们有两个功能,实时摄像头识别和图片识别,我们需要有个模式选择参数,1代表图像,0代表摄像头。3.算法接收到路径之后,进行图像处理,输出结果,需要将此结果绘制在label上。

a.跨文件的变量传递折腾了两三天,踩了无数坑,我的方法如下:
首先写个全局变量管理模块 globalvar.py。代码如下:

#globalvar.py#!/usr/bin/python# -*- coding: utf-8 -*- 
def _init():        
	global _global_dict        
	_global_dict = {}
def set_value(name, value):     
	_global_dict[name] = value 
def get_value(name, defValue=None):       
	try:         
		return _global_dict[name]        
	except KeyError:               
		return defValue

其次写个mainwindow.py来作为主函数,搭建沟通两个.py文件的桥梁:GUI程序名字:算法程序名字:tenforflow.py

发布了3 篇原创文章 · 获赞 0 · 访问量 93

猜你喜欢

转载自blog.csdn.net/qq_43125114/article/details/105364495