目标检测系列(四)-利用pyqt5实现yolov8目标检测GUI界面

1、pyqt5安装

Qt Designer:一个用于创建图形用户界面的工具,可轻松构建复杂的用户界面。它基于MVC架构,可以将界面设计与逻辑分离,使得开发更为便捷。在Qt Designer中,可以通过拖拽控件来灵活地调整界面,并可以实时查看控件效果。。

PyUIC:一个命令行工具,它将Qt Designer中设计的.ui文件转换为Python代码。这一功能极大地帮助了开发人员快速地将设计好的Qt Designer的.ui文件转换为可用的Python代码,从而提高了开发速度。

安装方法:

pip install pyqt5

pip install pyqt5-tools

然后搜索“designer”就可以看到是否安装好

2、PyCharm添加Qt Designer、PyUIC

点击菜单栏File——选择Setting,弹出设置界面。在设置界面中选择Tools—>External Tools

然后重启pycharm即可看见添加的外部工具:

3、Qt Designer设计界面

可以先打开Qt Designer,创建一个.ui然后保存到本地:

4、根据ui文件自动生成py文件

选中一个.ui,然后点击配置好的外部工具:Tools->External Tools->pyuic5,就会自动生成对应的.py文件的。

如果实在不知道怎么配置pycharm,也可以直接用终端命令来生成:

先用cd命令进入ui文件所在的路径下,然后执行命令:pyuic5 -o demo.py demo.ui

5、修改py文件来调用检测程序

经过前面几步只是对界面构建元素控件,接下来需要写代码来对每个控件进行点击响应操作:

①选择图片上传

②显示环境

③启动程序

④在setupui中添加上述点击响应函数

⑤修改继承类为QmainWindow并添加初始化函数

完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'BscanObjDetection.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 sys

from PyQt5 import QtCore, QtGui, QtWidgets
import torch
import torchvision
import cv2

from ultralytics import YOLO


class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.retranslateUi(self)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1131, 932)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(40, 20, 98, 26))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(220, 20, 98, 26))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(390, 20, 98, 26))
        self.pushButton_3.setObjectName("pushButton_3")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(40, 70, 1031, 61))
        self.textBrowser.setObjectName("textBrowser")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 180, 511, 451))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(590, 180, 491, 461))
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1131, 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_3.clicked.connect(self.startProgram)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "上传图片"))
        self.pushButton_2.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_path
        if image_path:
            # 在这里添加加载图片的逻辑,例如显示图片到label
            pixmap = QtGui.QPixmap(image_path)
            self.label.setPixmap(pixmap)
            self.label.setScaledContents(True)

    def showEnvironment(self):
        pytorch_version = torch.__version__
        torchvision_version = torchvision.__version__
        self.textBrowser.setText(f"PyTorch Version: {pytorch_version}\n"
                            f"Torchvision Version: {torchvision_version}")

    def startProgram(self):
        self.textBrowser.setText(self.image_path)
        model = YOLO(r'C:\work\PycharmProjects\BscanObjDetection\frame_count\runs\detect\best.pt')
        results = model(self.image_path)
        annotated_frame = results[0].plot()
        # 图片暂存
        save_image_name = self.image_path.split("/")[-1].split(".")[0] + "_pred"
        cv2.imwrite(f"C:\work\PycharmProjects\BscanObjDetection\data\predict\{save_image_name}.jpg", annotated_frame)

        # 将图像数据转换为QImage格式
        height, width, channel = annotated_frame.shape
        bytes_per_line = 3 * width
        qimage = QtGui.QImage(annotated_frame.data, width, height, bytes_per_line, QtGui.QImage.Format_RGB888)
        # 将QImage转换为QPixmap
        pixmap = QtGui.QPixmap.fromImage(qimage)

        # 都执行:
        self.label_2.setPixmap(pixmap)
        self.label_2.setScaledContents(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow1 = QMainWindow()  # MainWindow1随便改
    ui = Ui_MainWindow()  # 随便改
    ui.setupUi(MainWindow1)
    MainWindow1.show()
    sys.exit(app.exec_())

5、执行py文件启动

效果如下视频:

qt designer

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器人自主学习方法学习

各类算法的优缺点 原理: 该结构中初始的知识为0,不存在任何先验知识,让机器人与环境交互不断获得经验,是一个增量学习的过程。 算法举例 基于强化学习的开源算法及工具 OpenAI Gym:用于开发和比较强化学习算法的工具…

HTML5五十六个民族网站模板源码

文章目录 1.设计来源高山族1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 中国民族界面演示1.5 关于高山族界面演示1.6 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.ne…

《Redis设计与实现》阅读总结-2

第 7 章 压缩列表 1. 概念: 压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项是小整数值或长度比较短的字符串,那么Redis就会使用压缩类别来做列表键的底层实现。哈希键里面包含的所有键和值都是最小…

TEC相关专利研究

每天一篇行业发展资讯,让大家更及时了解外面的世界。 更多资讯,请关注B站/公众号【莱歌数字】,有视频教程~~ 关于TEC在电子行业的部署有很多讨论,这些专利显示了不同发明者关注的一些显著特征。下面的表1列出了本期将审查的专利…

【动态内存】详解

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

AI实战案例!如何运用SD完成运营设计海报?玩转Stable Diffusion必知的3大绝技

大家好我是安琪! Satble Diffusion 给视觉设计带来了前所未有的可能性和机会,它为设计师提供了更多选择和工具的同时,也改变了设计师的角色和设计流程。然而,设计师与人工智能软件的协作和创新能力仍然是不可或缺的。接下来我将从…

Java 中 String 类

目录 1 常用方法 1.1 字符串构造 1.2 字符串包含的成员 1.3 String 对象的比较 1.4 字符串查找 1.5 转化 1.5.1 数值和字符串转化 1.5.2 大小写转化 1.5.3 字符串转数组 1.5.4 格式化 1.6 字符串替换 1.7 字符串拆分 1.8 字符串截取 1.9 其他操作方法 1.10 字符…

DDR3控制器(一)DDR3 IP调用

目录 一、DDR3 IP核简介 二、DDR3 IP核调用 在千兆以太网通信中用到了DDR3控制器,但是并没有对其做相关介绍。这次准备重新整理一下DDR3控制相关知识,复习巩固一下。 一、DDR3 IP核简介 MIG IP核(Memory Interface Generator)是…

SiLM585x系列SiLM5851NHCG-DG一款具有分离的管脚输出 单通道隔离驱动器 拥有强劲的驱动能力

SiLM585x系列SiLM5851NHCG-DG是一款单通道隔离驱动器,具有分离的管脚输出,提供3.0A源电流和6.0A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 2.5A 米勒钳位。输入侧电源的工作电压为3V至5.5V,输出侧电源的工作电压范围为1…

计算机毕业设计Thinkphp/Laravel学生考勤管理系统zyoqy

管理员登录学生考勤管理系统后,可以对首页、个人中心、公告信息管理、年级管理、专业管理、班级管理、学生管理、教师管理、课程信息管理、学生选课管理、课程签到管理、请假申请管理、销假申请管理等功能进行相应操作,如图5-2所示。学生登录进入学生考勤…

一天跌20%,近500只下跌,低价可转债为何不香了?

6月以来,Wind可转债低价指数累计下跌7.3%,大幅跑输中价、高价转债。分析认为,市场调整的底层逻辑在于投资者对风险的重新评估和流动性的紧缩,宏观经济的波动和政策环境的不确定性、市场结构性的变化均对低价可转债市场产生了冲击。…

ai智能写作助手有哪些?3款AI工具推荐

ai智能写作助手有哪些?在数字化时代的浪潮中,AI智能写作助手如同智慧的灯塔,照亮了创作者们的道路。它们不仅极大地提升了写作效率,让文字流淌更加顺畅,更能够深入挖掘和激发创作者的内在灵感,将创意的火花…

RK3568平台开发系列讲解(I2C篇)利用逻辑分析仪进行I2C总线的全面分析

🚀返回专栏总目录 文章目录 1. 基础协议1.1. 协议简介1.2. 物理信号1.3. 总线连接沉淀、分享、成长,让自己和他人都能有所收获!😄 1. 基础协议 1.1. 协议简介 IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。 主要是用来方…

MYSQL 将某个字段赋值当前时间

如 我们需要将use_time 赋值为当前时间: 准备三条数据 : 执行sql ,2种当前时间赋值函数,1种关键字赋值 : update test_info SET use_timeNOW() WHERE id 1; update test_info SET use_timeCURRENT_TIMESTAMP() …

C++并发之阻塞队列(block,queue)

目录 1 概述2 实现3 测试3 运行 1 概述 最近研究了C11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的阻塞队列,队列大小没有限制。 阻塞队列是一个模板类,有两个模块参数,参数1是元素类型&…

【芯片】MCU的分类

MCU又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都…

MySQL报错Duplicate entry ‘0‘ for key ‘PRIMARY‘

报错现场 现象解释 因为你在插入时没有给 Customer.Id 赋值,MySQL 会倾向于赋值为 NULL。但是主键不能为 NULL,所以 MySQL 帮了你一个忙,将值转换为 0。这样,在第二次插入时就会出现冲突(如果已经有一条记录为 0&…

第二证券:什么是破净股票?破净股票好还是不好?

一家公司手上掌握的财物包含实物财物、公司注册资金、未分配利润、各种公积金及品牌价值等等,一家公司的负债包含贷款、应付款、其他公司给的预付款等等。公司的总财物减去总负债后得到的净财物,再除以股票总数,就是公司的每股净财物&#xf…

【LM-Debugger】让研究人员与开发者能够深入洞察并干预模型的预测过程,开启了模型透明度和可解释性的一扇新门

背景 基于 Transformer 的语言模型 (LM) 是现代 NLP 模型的支柱,但其内部预测构建过程不透明。这对于不了解模型为何做出特定预测的最终用户以及希望调试或修复模型行为的开发人员来说都是个问题用于检查和干预基于转换器的语言模型的交互式工具项目地址&#xff1…

React的Redux的状态管理

步骤 1.创建新项目 npx create-react-app react-redux 2.安装配套工具 npm i reduxjs/toolkit react-redux 3.启动项目 npm run start 4.在src目录下创建store文件夹 5.在store文件夹下创建modules文件夹 6.在store文件夹里创建index.js文件 7.在counterStore.js文件…