YOLOv8-PyQT5可视化界面

news/2025/3/11 10:02:45/文章来源:https://www.cnblogs.com/zmq-wj/p/18236892

使用PyQT5实现YOLOv8图形化界面
准备工作:
1、首先在YOLOv8环境中安装pyqt5

pip install pyqt5
pip install pyqt5-tools

然后再你的anaconda环境中找到designer.exe文件,双击运行,可以将其发送到桌面快捷方式方便后续使用
下面是我的文件所在路径地址,根据自己环境的位置进行查找。
C:\User\anaconda\envs\yolov8\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

2、运行的designer.exe后创建一个界面

如下图:

然后再右边任务栏中选择需要的功能

制作完界面之后将其保存到你的YOLOv8工程下,方便后续使用
我保存在如下位置

然后将使用pycharm扩展工具进行代码生成
步骤如下
点击File->Setting->External Tools->+(add)

程序去conda的envs我的环境路径如下所示,根据自己的环境位置进行寻找
C:\Users\Administrator\anaconda3\envs\yolov8\Scripts\pyuic5.exe
实参为:UI$FileName$ -o UI$FileNameWithoutExtension\(.py 最后的工作目录可以写: \)ProjectFileDir$
保存成功后进行如下操作生成代码

这样界面就生成啦
然后再根据自己打需求编写代码
我的界面如下图所示

我自己的代码如下所示

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'UI\demo.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog
import sysfrom PyQt5 import QtCore, QtGui, QtWidgets
import torch
import torchvision
import cv2
import numpy as np
from PyQt5.QtGui import QPalette, QBrush, QPixmap
from ultralytics import YOLOclass Ui_MainWindow(QMainWindow):def __init__(self):super().__init__()self.setupUi(self)self.retranslateUi(self)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(690, 390, 75, 23))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(690, 430, 75, 23))self.pushButton_2.setObjectName("pushButton_2")self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_3.setGeometry(QtCore.QRect(690, 470, 75, 23))self.pushButton_3.setObjectName("pushButton_3")self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_4.setGeometry(QtCore.QRect(690, 510, 75, 23))self.pushButton_4.setObjectName("pushButton_4")self.label_3 = QtWidgets.QTextBrowser(self.centralwidget)self.label_3.setGeometry(QtCore.QRect(40, 400, 581, 141))self.label_3.setObjectName("label_3")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(50, 30, 321, 301))self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(410, 30, 321, 301))self.label_2.setObjectName("label_2")self.line = QtWidgets.QFrame(self.centralwidget)self.line.setGeometry(QtCore.QRect(370, 30, 41, 301))self.line.setFrameShape(QtWidgets.QFrame.VLine)self.line.setFrameShadow(QtWidgets.QFrame.Sunken)self.line.setObjectName("line")self.line_2 = QtWidgets.QFrame(self.centralwidget)self.line_2.setGeometry(QtCore.QRect(0, 360, 791, 20))self.line_2.setFrameShape(QtWidgets.QFrame.HLine)self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)self.line_2.setObjectName("line_2")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))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)# 点击响应函数self.pushButton.clicked.connect(self.uploadImage)self.pushButton_2.clicked.connect(self.showEnvironment)self.pushButton_4.clicked.connect(self.startProgram)self.pushButton_3.clicked.connect(self.select_weight_file)# self.image_path = ''def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "道路缺陷检测"))self.pushButton.setText(_translate("MainWindow", "上传图片"))self.pushButton_2.setText(_translate("MainWindow", "显示环境"))self.pushButton_4.setText(_translate("MainWindow", "启动程序"))self.pushButton_3.setText(_translate("MainWindow", "模型选择"))self.label.setText(_translate("MainWindow", "原始图片"))self.label_2.setText(_translate("MainWindow", "检测结果"))def uploadImage(self):file_dialog = QFileDialog()image_path, _ = file_dialog.getOpenFileName(self, '选择图片', '', 'Images (*.png *.xpm *.jpg *.bmp)')self.image_path = image_pathif image_path:# 在这里添加加载图片的逻辑,例如显示图片到label2pixmap = QtGui.QPixmap(image_path)self.label.setPixmap(pixmap)self.label.setScaledContents(True)def showEnvironment(self):pytorch_version = torch.__version__torchvision_version = torchvision.__version__self.label_3.setText(f"PyTorch Version: {pytorch_version}\n"f"Torchvision Version: {torchvision_version}")def select_weight_file(self):file_dialog = QFileDialog()weight_file_path, _ = file_dialog.getOpenFileName(self, "选择YOLOv8权重文件", "", "权重文件 (*.pt)")self.weight_file_path = weight_file_pathif weight_file_path:self.label_3.setText(f"网络模型: {weight_file_path}")def startProgram(self):self.label_3.setText(self.image_path)model = YOLO(self.weight_file_path)results = model(self.image_path)annotated_frame = results[0].plot()# 将图像数据转换为QImage格式height, width, channel = annotated_frame.shapebytes_per_line = 3 * widthqimage = QtGui.QImage(annotated_frame.data, width, height, bytes_per_line, QtGui.QImage.Format_RGB888)# 将QImage转换为QPixmappixmap = QtGui.QPixmap.fromImage(qimage)#都执行:self.label_2.setPixmap(pixmap)self.label_2.setScaledContents(True)
if __name__ == '__main__':app = QApplication(sys.argv)MainWindow1 = QMainWindow()     #MainWindow1随便改palette = QPalette()palette.setBrush(QPalette.Background, QBrush(QPixmap("/UI\\background\\1.jpg")))  #界面背景图MainWindow1.setPalette(palette)ui = Ui_MainWindow()             #随便改ui.setupUi(MainWindow1)MainWindow1.show()sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721341.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果电脑显示一个问号该如何解决—成功案例

这样的数据恢复用户可以自己完成吗? 今天我们来看一个案例,一台A1465的苹果电脑,开机时显示一个问号,系统是进不了的。客户的描述是:机器出了问题以后,去苹果售后维修站做过一些检测,对方告诉他可能是硬盘坏了,但是因为苹果官方不提供数据恢复救援工作。苹果电脑的硬盘…

HBuilder解决:Error: error:0308010C:digital envelope routines::unsupported

操作系统是 win10,HbuilderX 版本 4.18,已安装了 nvm,尝试按照网上说的切换到 node v16 或者 node v12 版本,或者在命令行先运行环境参数命令,再次在 HbuilderX 运行小程序或者发布小程序,HBuilderX 仍然反复提示错误 Error: error:0308010C:digital envelope routines::…

统计 | 思维导图

统计 | 思维导图,适合2019 人教A版教材前言 使用方法:如果想得到更好的显示效果,可以点击全屏按钮,已经实现电脑端、手机端的适配,效果很好;电视端没有实现适配,Ipad端的适配没有测试; 思维导图全屏

OCA/base_report_to_printer 配置Odoo云打印

系统结构安装部署 Odoo 安装模块依赖pip install pycups 安装OCA模块report-print-send/base_report_to_printer cups cups简介 CUPS(Common UNIX Printing System)是一个开源的打印系统,用于在 Unix-like 操作系统上管理打印任务。它提供了打印机驱动程序、打印队列管理、打…

2024 Web 新特性 - 使用 Popover API 创建弹窗

Popover API 为开发者提供了一种声明式的方式来创建各种类型的弹窗。目前已在所有三大浏览器引擎中可用,并正式成为 Baseline 2024 的一部分。Popover API 为开发者提供了一种声明式的方式来创建各种类型的弹窗。目前已在所有三大浏览器引擎中可用,并正式成为 Baseline 2024 …

ubuntu 16.8升级nodejs

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - $node --version v16.20.2

lodash已死?radash库方法介绍及源码解析 —— 判断方法篇

目前为止,radash库的所有方法我们已经分享完毕。如果你想尝试使用,又或者想了解下源码,阿瓜的文章都值得一读,相信你总能有所收获。后续我们回整理一份使用说明进行发布。前言 大家好,我是阿瓜。一个励志分享更多技术的前端瓜 ~ 我们已经分享了 radash 库中数组、对象等相…

PyCharm的安装

PyCharm的安装 PyCharm是一款由JetBrains公司开发的强大的Python集成开发环境(IDE),它提供了代码分析、图形化调试器、集成单元测试、版本控制等功能,极大地提高了Python开发者的工作效率。以下是PyCharm社区版的详细安装步骤。 一、下载PyCharm安装包 首先,我们需要访问P…

allure安装配置使用 简单版

环境安装 一、安装配置JDK 先检查是否安装JDK,cmd中查看java版本:java -version若未安装,以下面的步骤安装: 1、Oracle官网下载JDK:https://www.oracle.com/java/technologies/downloads/,请下载安装JDK8及以上版本 2、安装JDK 3、JDK配置环境变量:win10系统右击“我的电…

dubbo~全局异常拦截器的使用与设计缺陷

异常拦截器ExceptionMapper 在JAX-RS(Java API for RESTful Web Services)中,ExceptionMapper接口用于将Java异常映射到HTTP响应。通过实现ExceptionMapper接口,你可以自定义如何处理特定类型的异常,并生成相应的HTTP响应。 优先级和选择 当有多个ExceptionMapper可用于处…

RPC--远程过程调用协议

简单介绍一下RPC什么是RPC? RPC的全称是:Remote Procedure Call,远程过程调用。它的作用就是允许一台机器上的程序去调用另一台机器上的程序,而不会意识到这个过程是远程的,也就是程序员不需要知道网络通信中的任何细节。 为什么要使用RPC?提高开发效率:程序员不需要再关…

echarts 曲线中显示最大值进行标签样式的设置和修改

曲线中最大值最小值需要完善一些相关的信息 let color = [ #ee6666, #73c0de, #3ba272, #fc8452, #9a60b4, #ea7ccc] let xData =[00:00, 04:00, 08:00, 12:00, 16:00, 20:00, 24:00] //item 是循环的后台返回的数据,用来构造有几条曲线 //关键代码还是markPoint中的内容 data…