我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Yolov5(v5.0) + pyqt5界面设计

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Yolov5(v5.0) + pyqt5界面设计

1.下载安装pyqt5工具包以及配置ui界面开发环境

pip install PyQt5pip install PyQt5-tools

2.点击File->Settings->External Tools进行工具添加,依次进行Qt Designer、PyUIC环境配置.

 2.1 添加QtDesigner

 Qt Designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计

位置内容
name可以随便命名,只要便于记忆就可以,本次采取通用命名:Qt Designer
Programdesigner.exe路径,一般在python中.\Library\bin\designer.exe
Arguments固定格式,直接复制也可:$FileDir$\$FileName$
Working directory固定格式,直接复制也可:$FileDir$

2.2 添加PyUIC

 PyUIC主要是把Qt Designer生成的.ui文件换成.py文件

位置内容
name可以随便命名,只要便于记忆就可以,本次采取通用命名:PyUiC
Programpython.exe路径,一般在python安装根目录中
Arguments固定格式,直接复制也可:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working directory固定格式,直接复制也可:$FileDir$

3. QtDesigner建立图形化窗口界面 

3.1 在根目录下新建UI文件夹进行UI文件的专门存储,点击Tools->External Tools->Qt Designer进行图形界面创建.

 3.2 创建一个Main Window窗口

3.3 完成基本界面开发后,保存其为Detect.ui,放置在UI文件夹下,利用PyUic工具将其转化为Detect.py文件。

转换完成后,进行相应的槽函数的建立与修改,此处建议直接看我后面给出的demo。

4. demo

使用时只需将parser.add_argument中的'--weights'设为响应权重即可。

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '.\project.ui'## Created by: PyQt5 UI code generator 5.9.2## WARNING! All changes made in this file will be lost!import sysimport cv2import argparseimport randomimport torchimport numpy as npimport torch.backends.cudnn as cudnnfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom utils.torch_utils import select_devicefrom models.experimental import attempt_loadfrom utils.general import check_img_size, non_max_suppression, scale_coordsfrom utils.datasets import letterboxfrom utils.plots import plot_one_boxclass Ui_MainWindow(QtWidgets.QMainWindow):    def __init__(self, parent=None):        super(Ui_MainWindow, self).__init__(parent)        self.timer_video = QtCore.QTimer()        self.setupUi(self)        self.init_logo()        self.init_slots()        self.cap = cv2.VideoCapture()        self.out = None        # self.out = cv2.VideoWriter('prediction.avi', cv2.VideoWriter_fourcc(*'XVID'), 20.0, (640, 480))        parser = argparse.ArgumentParser()        parser.add_argument('--weights', nargs='+', type=str,default='weights/best.pt', help='model.pt path(s)')        # file/folder, 0 for webcam        parser.add_argument('--source', type=str,default='data/images', help='source')        parser.add_argument('--img-size', type=int,default=640, help='inference size (pixels)')        parser.add_argument('--conf-thres', type=float,default=0.25, help='object confidence threshold')        parser.add_argument('--iou-thres', type=float,default=0.45, help='IOU threshold for NMS')        parser.add_argument('--device', default='',help='cuda device, i.e. 0 or 0,1,2,3 or cpu')        parser.add_argument(            '--view-img', action='store_true', help='display results')        parser.add_argument('--save-txt', action='store_true',help='save results to *.txt')        parser.add_argument('--save-conf', action='store_true',help='save confidences in --save-txt labels')        parser.add_argument('--nosave', action='store_true',help='do not save images/videos')        parser.add_argument('--classes', nargs='+', type=int,help='filter by class: --class 0, or --class 0 2 3')        parser.add_argument(            '--agnostic-nms', action='store_true', help='class-agnostic NMS')        parser.add_argument('--augment', action='store_true',help='augmented inference')        parser.add_argument('--update', action='store_true',help='update all models')        parser.add_argument('--project', default='runs/detect',help='save results to project/name')        parser.add_argument('--name', default='exp',help='save results to project/name')        parser.add_argument('--exist-ok', action='store_true',help='existing project/name ok, do not increment')        self.opt = parser.parse_args()        print(self.opt)        source, weights, view_img, save_txt, imgsz = self.opt.source, self.opt.weights, self.opt.view_img, self.opt.save_txt, self.opt.img_size        self.device = select_device(self.opt.device)        self.half = self.device.type != 'cpu'  # half precision only supported on CUDA        cudnn.benchmark = True        # Load model        self.model = attempt_load(            weights, map_location=self.device)  # load FP32 model        stride = int(self.model.stride.max())  # model stride        self.imgsz = check_img_size(imgsz, s=stride)  # check img_size        if self.half:            self.model.half()  # to FP16        # Get names and colors        self.names = self.model.module.names if hasattr(            self.model, 'module') else self.model.names        self.colors = [[random.randint(0, 255)                        for _ in range(3)] for _ in self.names]    def setupUi(self, MainWindow):        MainWindow.setObjectName("MainWindow")        MainWindow.resize(800, 600)        self.centralwidget = QtWidgets.QWidget(MainWindow)        self.centralwidget.setObjectName("centralwidget")        self.pushButton = QtWidgets.QPushButton(self.centralwidget)        self.pushButton.setGeometry(QtCore.QRect(20, 130, 112, 34))        self.pushButton.setObjectName("pushButton")        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)        self.pushButton_2.setGeometry(QtCore.QRect(20, 220, 112, 34))        self.pushButton_2.setObjectName("pushButton_2")        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)        self.pushButton_3.setGeometry(QtCore.QRect(20, 300, 112, 34))        self.pushButton_3.setObjectName("pushButton_3")        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)        self.groupBox.setGeometry(QtCore.QRect(160, 90, 611, 411))        self.groupBox.setObjectName("groupBox")        self.label = QtWidgets.QLabel(self.groupBox)        self.label.setGeometry(QtCore.QRect(10, 40, 561, 331))        self.label.setObjectName("label")        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)        self.textEdit.setGeometry(QtCore.QRect(150, 10, 471, 51))        self.textEdit.setObjectName("textEdit")        MainWindow.setCentralWidget(self.centralwidget)        self.menubar = QtWidgets.QMenuBar(MainWindow)        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))        self.menubar.setObjectName("menubar")        MainWindow.setMenuBar(self.menubar)        self.statusbar = QtWidgets.QStatusBar(MainWindow)        self.statusbar.setObjectName("statusbar")        MainWindow.setStatusBar(self.statusbar)        self.retranslateUi(MainWindow)        QtCore.QMetaObject.connectSlotsByName(MainWindow)    def retranslateUi(self, MainWindow):        _translate = QtCore.QCoreApplication.translate        MainWindow.setWindowTitle(_translate("MainWindow", "演示系统"))        self.pushButton.setText(_translate("MainWindow", "图片检测"))        self.pushButton_2.setText(_translate("MainWindow", "摄像头检测"))        self.pushButton_3.setText(_translate("MainWindow", "视频检测"))        self.groupBox.setTitle(_translate("MainWindow", "检测结果"))        self.label.setText(_translate("MainWindow", "TextLabel"))        self.textEdit.setHtml(_translate("MainWindow",            "\n"            "\n"            "

演示系统

")) def init_slots(self): self.pushButton.clicked.connect(self.button_image_open) self.pushButton_3.clicked.connect(self.button_video_open) self.pushButton_2.clicked.connect(self.button_camera_open) self.timer_video.timeout.connect(self.show_video_frame) def init_logo(self): pix = QtGui.QPixmap('wechat.jpg') self.label.setScaledContents(True) self.label.setPixmap(pix) def button_image_open(self): print('button_image_open') name_list = [] img_name, _ = QtWidgets.QFileDialog.getOpenFileName( self, "打开图片", "", "*.jpg;;*.png;;All Files(*)") if not img_name: return img = cv2.imread(img_name) print(img_name) showimg = img with torch.no_grad(): img = letterbox(img, new_shape=self.opt.img_size)[0] # Convert # BGR to RGB, to 3x416x416 img = img[:, :, ::-1].transpose(2, 0, 1) img = np.ascontiguousarray(img) img = torch.from_numpy(img).to(self.device) img = img.half() if self.half else img.float() # uint8 to fp16/32 img /= 255.0 # 0 - 255 to 0.0 - 1.0 if img.ndimension() == 3: img = img.unsqueeze(0) # Inference pred = self.model(img, augment=self.opt.augment)[0] # Apply NMS pred = non_max_suppression(pred, self.opt.conf_thres, self.opt.iou_thres, classes=self.opt.classes, agnostic=self.opt.agnostic_nms) print(pred) # Process detections for i, det in enumerate(pred): if det is not None and len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords( img.shape[2:], det[:, :4], showimg.shape).round() for *xyxy, conf, cls in reversed(det): label = '%s %.2f' % (self.names[int(cls)], conf) name_list.append(self.names[int(cls)]) plot_one_box(xyxy, showimg, label=label, color=self.colors[int(cls)], line_thickness=2) cv2.imwrite('prediction.jpg', showimg) self.result = cv2.cvtColor(showimg, cv2.COLOR_BGR2BGRA) self.result = cv2.resize( self.result, (640, 480), interpolation=cv2.INTER_AREA) self.QtImg = QtGui.QImage( self.result.data, self.result.shape[1], self.result.shape[0], QtGui.QImage.Format_RGB32) self.label.setPixmap(QtGui.QPixmap.fromImage(self.QtImg)) def button_video_open(self): video_name, _ = QtWidgets.QFileDialog.getOpenFileName( self, "打开视频", "", "*.mp4;;*.avi;;All Files(*)") if not video_name: return flag = self.cap.open(video_name) if flag == False: QtWidgets.QMessageBox.warning( self, u"Warning", u"打开视频失败", buttons=QtWidgets.QMessageBox.Ok, defaultButton=QtWidgets.QMessageBox.Ok) else: self.out = cv2.VideoWriter('prediction.avi', cv2.VideoWriter_fourcc( *'MJPG'), 20, (int(self.cap.get(3)), int(self.cap.get(4)))) self.timer_video.start(30) self.pushButton_3.setDisabled(True) self.pushButton.setDisabled(True) self.pushButton_2.setDisabled(True) def button_camera_open(self): if not self.timer_video.isActive(): # 默认使用第一个本地camera flag = self.cap.open(0) if flag == False: QtWidgets.QMessageBox.warning( self, u"Warning", u"打开摄像头失败", buttons=QtWidgets.QMessageBox.Ok, defaultButton=QtWidgets.QMessageBox.Ok) else: self.out = cv2.VideoWriter('prediction.avi', cv2.VideoWriter_fourcc( *'MJPG'), 20, (int(self.cap.get(3)), int(self.cap.get(4)))) self.timer_video.start(30) self.pushButton_3.setDisabled(True) self.pushButton.setDisabled(True) self.pushButton_2.setText(u"关闭摄像头") else: self.timer_video.stop() self.cap.release() self.out.release() self.label.clear() self.init_logo() self.pushButton_3.setDisabled(False) self.pushButton.setDisabled(False) self.pushButton_2.setText(u"摄像头检测") def show_video_frame(self): name_list = [] flag, img = self.cap.read() if img is not None: showimg = img with torch.no_grad(): img = letterbox(img, new_shape=self.opt.img_size)[0] # Convert # BGR to RGB, to 3x416x416 img = img[:, :, ::-1].transpose(2, 0, 1) img = np.ascontiguousarray(img) img = torch.from_numpy(img).to(self.device) img = img.half() if self.half else img.float() # uint8 to fp16/32 img /= 255.0 # 0 - 255 to 0.0 - 1.0 if img.ndimension() == 3: img = img.unsqueeze(0) # Inference pred = self.model(img, augment=self.opt.augment)[0] # Apply NMS pred = non_max_suppression(pred, self.opt.conf_thres, self.opt.iou_thres, classes=self.opt.classes, agnostic=self.opt.agnostic_nms) # Process detections for i, det in enumerate(pred): # detections per image if det is not None and len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(img.shape[2:], det[:, :4], showimg.shape).round() # Write results for *xyxy, conf, cls in reversed(det):label = '%s %.2f' % (self.names[int(cls)], conf)name_list.append(self.names[int(cls)])print(label)plot_one_box( xyxy, showimg, label=label, color=self.colors[int(cls)], line_thickness=2) self.out.write(showimg) show = cv2.resize(showimg, (640, 480)) self.result = cv2.cvtColor(show, cv2.COLOR_BGR2RGB) showImage = QtGui.QImage(self.result.data, self.result.shape[1], self.result.shape[0], QtGui.QImage.Format_RGB888) self.label.setPixmap(QtGui.QPixmap.fromImage(showImage)) else: self.timer_video.stop() self.cap.release() self.out.release() self.label.clear() self.pushButton_3.setDisabled(False) self.pushButton.setDisabled(False) self.pushButton_2.setDisabled(False) self.init_logo()if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) ui = Ui_MainWindow() ui.show() sys.exit(app.exec_())

5.添加背景图片

将demo中最后一段代码改为如下,其中background-image为背景图片地址。

if __name__ == '__main__':    stylesheet = """            Ui_MainWindow {                background-image: url("4K.jpg");                background-repeat: no-repeat;                background-position: center;            }        """    app = QtWidgets.QApplication(sys.argv)    app.setStyleSheet(stylesheet)    ui = Ui_MainWindow()    ui.show()    sys.exit(app.exec_())

 

6.reference

http://t.csdn.cn/ZVtSKicon-default.png?t=M85Bhttp://t.csdn.cn/ZVtSKPyQt5系列教程(三)利用QtDesigner设计UI界面 - 迷途小书童的Note迷途小书童的Note (xugaoxiang.com)icon-default.png?t=M85Bhttps://xugaoxiang.com/2019/12/04/pyqt5-3-qtdesigner/ 

来源地址:https://blog.csdn.net/m0_56247038/article/details/127898782

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Yolov5(v5.0) + pyqt5界面设计

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Yolov5(v5.0)+pyqt5界面设计图文教程

众所周知界面设计一般指UI设计,下面这篇文章主要给大家介绍了关于Yolov5(v5.0)+pyqt5界面设计的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-16

PyQt5如何设置登录界面及界面美化功能

这篇文章主要介绍“PyQt5如何设置登录界面及界面美化功能”,在日常操作中,相信很多人在PyQt5如何设置登录界面及界面美化功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PyQt5如何设置登录界面及界面美
2023-06-14

Node-Red UI界面基础设计

Node-Red UI界面基础设计 1.UI界面介绍2.dashborad标签(1)Layout(2)Site(3)Theme 1.UI界面介绍 UI的布局依赖于节点中Tab和Group属性。Tab可以理解为页面,Group
2023-08-18

怎么进行Flex界面设计

这篇文章给大家分享的是有关怎么进行Flex界面设计的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex界面设计使用组件可快速有效开发应用界面。以下介绍最简单的几个组件应用过程,登陆作为检验合法用户身份的有效方法
2023-06-17

数据库界面设计怎么做

数据库界面设计的一般步骤如下:1. 确定需求:明确数据库界面的功能和目标,包括需要展示的数据、操作方式、用户角色等。2. 设计数据结构:根据需求设计数据库的表结构,包括表之间的关系和字段定义。3. 设计界面布局:确定界面的整体布局,包括菜单
2023-08-25

VB.NET界面设计技巧有哪些

这篇文章主要介绍了VB.NET界面设计技巧有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。VB.NET界面设计一、窗体设计窗体设计的好坏往往影响到软件的整体形象,因此必须
2023-06-17

上位机的界面如何设计

上位机的界面设计是上位机开发的重要组成部分之一,良好的界面设计可以提高用户体验,使操作更加便捷和高效。以下是一些上位机界面设计的基本原则和技巧:一、界面布局界面布局是指界面中各个组件的位置和排列方式。在设计界面布局时,应该遵循以下原则:简洁
2023-10-27

Pyqt5界面与逻辑分离的小计算器程序怎么使用

这篇文章主要介绍了Pyqt5界面与逻辑分离的小计算器程序怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Pyqt5界面与逻辑分离的小计算器程序怎么使用文章都会有所收获,下面我们一起来看看吧。直接看下最终效
2023-07-05

Ubuntu下Pygame游戏界面设计思路

在Ubuntu下设计Pygame游戏界面时,需要考虑多个方面,包括游戏窗口的创建、图形渲染、事件处理、音效等。以下是一些基本的设计思路:初始化Pygame:首先,需要导入pygame模块并初始化。这通常在游戏开始之前完成。创建游戏窗口:使
Ubuntu下Pygame游戏界面设计思路
2024-10-13

Android用户注册界面简单设计

本文实例为大家分享了Android用户注册界面的设计,供大家参考,具体内容如下 I. 实例目标 设计一个用户注册界面,在其中要使用到一些基础控件,如 文本框、编辑框、按钮、复选框等控件 II. 技术分析 首先在布局文件中使用控件的标记来
2022-06-06

【高清图】全新Win9概念版界面图 界面设计堪称惊艳

目前,关于微软下一代操作系统Wandroidindows 9的传闻不断,据称在Windows 9中,我们将看到经典开始菜单的回归,python以及改进后的Metro界面等等。 今天,设计师Martin Androvich就展示了他的Wind
2023-06-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录