当前位置:   article > 正文

为你的目标检测添加GUI可视化(Python)_detect.py gui

detect.py gui

GUI是图形用户界面的简称,可以添加各种有趣的东西,接下来说一个比较简单的GUI界面,可以调用其他的脚本运行然后显示出结果。

1.需要的库

  1. import subprocess
  2. import sys
  3. import numpy as np
  4. from PIL import Image
  5. import os
  6. from PyQt5.QtGui import QImage, QPixmap, QIcon, QColor
  7. from PyQt5.QtCore import pyqtSlot, QSize, Qt
  8. from PyQt5.QtWidgets import QApplication, QTextBrowser, QWidget, QLabel, QPushButton, QFileDialog, QFrame, QVBoxLayout, QMessageBox

2.可视化界面设置

  1. class YourName(QWidget):
  2. def __init__(self):
  3. QWidget.__init__(self)
  4. self.initUI()

3.界面布局

  1. def initUI(self):
  2. # -----------------------------#
  3. # 初始化标题,界面大小,以及layout自适应大小
  4. # -----------------------------#
  5. self.resize(1170, 702)
  6. self.setWindowTitle('写软件的名称')
  7. self.layout = QVBoxLayout()
  8. self.setLayout(self.layout)
  9. # -----------------------------#
  10. # 设置寻找初始图片路径的按钮
  11. # -----------------------------#
  12. self.btn_photo = QPushButton(' 获取图片', self)
  13. self.btn_photo.setToolTip('点击后从电脑中读取图片')
  14. self.btn_photo.setIcon(QIcon("path")) #填入图片的地址,为你的搜索增添色彩
  15. self.btn_photo.clicked.connect(self.open_and_save_image)
  16. self.selected_image = None
  17. self.save_path = 'path' #选择图片后图片保存的位置
  18. # -----------------------------#
  19. # 设置“input”这个文字大小和位置
  20. # 放到10,60
  21. # 拉伸长度为200,30
  22. # -----------------------------#
  23. self.origin_text = QTextBrowser(self)
  24. self.origin_text.setTextColor(QColor(23, 32, 32))
  25. self.origin_text.setText("Inputs:")
  26. self.origin_text.setStyleSheet("border:none;background-color:rgba(0,0,0,0)")
  27. # -----------------------------#
  28. # 设置“output”这个文字大小和位置
  29. # 放到10,60
  30. # 拉伸长度为200,30
  31. # -----------------------------#
  32. self.output_text = QTextBrowser(self)
  33. self.output_text.setText("Outputs:")
  34. self.output_text.setStyleSheet("border:none;background-color:rgba(0,0,0,0)")
  35. # -----------------------------#
  36. # 设置箭头
  37. # -----------------------------#
  38. self.arrow_text = QTextBrowser(self)
  39. self.arrow_text.setText("→")
  40. self.arrow_text.setStyleSheet("border:none;background-color:rgba(0,0,0,0);font-size:50px")
  41. # -----------------------------#
  42. # 设置运行的按钮
  43. # 设置名称
  44. # 设置位置以及大小
  45. # 设置调用的函数
  46. # -----------------------------#
  47. self.btn_detect = QPushButton('Detect', self)
  48. self.btn_detect.clicked.connect(self.Call_Function)
  49. # -----------------------------#
  50. # 设置输入显示的图片
  51. # -----------------------------#
  52. self.label_h = 500
  53. self.label_w = 500
  54. self.label_show_input = QLabel(self)
  55. self.label_show_input.setStyleSheet("QLabel{background:white;}")
  56. self.label_show_input.setObjectName("Inputs")
  57. self.label_show_input.setScaledContents(True)
  58. # -----------------------------#
  59. # 设置输出显示的图片
  60. # -----------------------------#
  61. self.label_h = 500
  62. self.label_w = 500
  63. self.label_show_output = QLabel(self)
  64. self.label_show_output.setStyleSheet("QLabel{background:white;}")
  65. self.label_show_output.setObjectName("Outputs")
  66. self.label_show_output.setScaledContents(True)
  67. self.show()

4.设置对检测目标的打开和保存的函数

  1. # -----------------------------#
  2. # 打开图片模式
  3. # -----------------------------#
  4. @pyqtSlot()
  5. def open_and_save_image(self):
  6. imgName, _ = QFileDialog.getOpenFileName(self, '打开图片', '.', 'Images (*.png *.jpg *.jpeg *.bmp)')
  7. if len(imgName) == 0:
  8. return
  9. show = Image.open(imgName).convert("RGB")
  10. show = show.resize([self.label_w, self.label_h])
  11. showImage = QImage(np.array(show), np.shape(show)[1], np.shape(show)[0], QImage.Format_RGB888)
  12. self.label_show_input.setPixmap(QPixmap.fromImage(showImage))
  13. if imgName:
  14. self.selected_image = QPixmap(imgName)
  15. if not self.selected_image.isNull():
  16. self.label_show_input.setPixmap(self.selected_image)
  17. self.label_show_input.setText("")
  18. self.selected_image.save(self.save_path)
  19. print(f"Image saved to {self.save_path}")
  20. else:
  21. self.label_show_input.setText("Invaild Image File")

5.设置运行其他脚本的函数

  1. def Call_Function(self):
  2. out_image_path = "E:/pycharm_workspace/Muti-DLC-GUI/Detect Img/0001.jpg"
  3. try:
  4. # 运行另一个Python的脚本
  5. subprocess.run(["python", "E:/pycharm_workspace/Muti-DLC-GUI/v7/predict.py"])
  6. pixmap = QPixmap(out_image_path)
  7. if not pixmap.isNull():
  8. self.label_show_output.setPixmap(pixmap)
  9. else:
  10. self.show_error()
  11. #os.remove(self.save_path) #可选项,检测完后删除原图,可以新开图点检测不报错
  12. #os.remove(out_image_path) #可选项,检测完后删除检测好的图片,可以新开图点检测不报错
  13. except FileNotFoundError:
  14. print("File not found or path is incorrect.")

6.设置保存检测目标的函数

  1. def save_image(self):
  2. if self.selected_image:
  3. save_path, _ = QFileDialog.getSaveFileName(self, 'Save File', '.', 'PNG Files (*.png);;JPEG Files (*.jpg *.jpeg)')
  4. if save_path:
  5. self.selected_image.save(save_path)

7.设置报错函数

  1. def show_error(self):
  2. msg_box = QMessageBox()
  3. msg_box.setWindowTitle('Error!')
  4. msg_box.setText('Error! Please Check the path or Put a Image in the window!')
  5. msg_box.setIcon(QMessageBox.Information)
  6. msg_box.setStandardButtons(QMessageBox.Ok)
  7. msg_box.exec_()

8.设置GUI内所有元素的自适应大小变化

  1. def resizeEvent(self, event):
  2. # 获取窗口的实时大小,设置基础参数,保证大小自适应
  3. origin_height = 702 #当前窗口的大小
  4. origin_width = 1170
  5. window_height = self.height()
  6. window_width = self.width()
  7. height_radio = window_height / origin_height
  8. width_radio = window_width / origin_width
  9. height_add = height_radio*origin_height #高度的相对位置参数
  10. width_add = width_radio*origin_width #宽度的相对位置参数
  11. #以下的所有数字都可以变化,看你的布局自行调整
  12. #1.自适应图片获取的按钮设置
  13. self.btn_photo.setIconSize(QSize(int(0.043*width_add), int(0.071*height_add)))
  14. self.btn_photo.resize(int(0.128*width_add), int(0.086*height_add))
  15. self.btn_photo.move(int(0.011*width_add), int(0.029*height_add))
  16. #2.自适应私货的设置
  17. self.text_browser.move(int(0.011*width_add), int(0.936*height_add))
  18. self.text_browser.setFixedSize(int(0.222*width_add), int(0.056*height_add))
  19. #3.自适应"输入"文字的设置
  20. self.origin_text.move(int(0.008*width_add), int(0.142*height_add))
  21. self.origin_text.setFixedSize(int(0.222*width_add), int(0.057*height_add))
  22. #4.自适应"输出"文字的设置
  23. self.output_text.move(int(0.533*width_add), int(0.142*height_add))
  24. self.output_text.setFixedSize(int(0.222*width_add), int(0.056*height_add))
  25. #5.自适应箭头的设置
  26. self.arrow_text.move(int(0.462*width_add), int(0.5*height_add))
  27. self.arrow_text.setFixedSize(int(0.256*width_add), int(0.114*height_add))
  28. #6.自适应检测按钮的设置
  29. self.btn_detect.setGeometry(int(0.453*width_add), int(0.456*height_add), int(0.068*width_add), int(0.046*height_add))
  30. #7.自适应两个框大小的设置
  31. self.label_show_input.move(int(0.011*width_add), int(0.181*height_add))
  32. self.label_show_input.setFixedSize(int(0.427*width_add), int(0.714*height_add))
  33. self.label_show_output.move(int(0.533*width_add), int(0.181*height_add))
  34. self.label_show_output.setFixedSize(int(0.427*width_add), int(0.714*height_add))

 最后添加主函数连接起来即可

  1. if __name__ == '__main__':
  2. app = QApplication(sys.argv)
  3. ex = YourName()
  4. sys.exit(app.exec_())

以下是我弄的最后的效果图:

鄙人还是新手小白,如果有什么可以改进的地方请务必私聊我!谢谢各位大佬​​​​​​​

参考文献:PyQt5入门4——给目标检测算法构建一个简单的界面-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/568251
推荐阅读
相关标签
  

闽ICP备14008679号