YOLOV8 + PYQT5单目测距—风险类别检测(五)

YOLOV8 + PYQT5单目测距

  • 1. 相关配置
  • 2. 测距源码
  • 3. PYQT环境配置
  • 4. 实验结果
    • 4.1 界面
    • 4.2 界面卡住解决方案
  • 5. 实现效果

1. 相关配置

系统:win 10
YOLO版本:yolov8
拍摄视频设备:安卓手机
电脑显卡:NVIDIA 2080Ti(CPU也可以跑,GPU只是起到加速推理效果)

2. 测距源码

详见文章 YOLOv8跟踪分割+单目测距(python),下载源码后进入下一步

3. PYQT环境配置

首先安装一下pyqt5

pip install PyQt5
pip install PyQt5-tools

接着再pycharm设置里配置一下
请添加图片描述
添加下面两个工具:
工具1:Qt Designer

Program D:\Anaconda3\Lib\site-packages\qt5_applications\Qt\bin\designer.exe#代码所用环境路径
Arauments : $FileName$
Working directory :$FileDir$

请添加图片描述
工具2:PyUIC

Program D:\Anaconda3\Scripts\pyuic5.exe 
Arguments : $FileName$ -o $FileNameWithoutExtension$.py
Working directory :$FileDir$

请添加图片描述

4. 实验结果

4.1 界面

创建一个main.py文件,将以下代码写入

import sys

import torch
import torchvision
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QLabel
from PyQt5 import QtCore, QtGui, QtWidgets
import cv2
from ultralytics import YOLO
from distance import person_distance,car_distance
class Ui_MainWindow(QMainWindow):
    # global text_dis
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.retranslateUi(self)
        self.image_path = ''
        self.label = QLabel(self)
        self.label.setGeometry(50, 50, 200, 50)
        # self.text_dis = None
        # 创建一个QTextBrowser来显示变量值
        self.text_browser = QtWidgets.QTextBrowser(self.centralwidget)
        # 添加QTextBrowser到窗口的布局中
        self.setCentralWidget(self.text_browser)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1128, 1009)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 10, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(160, 10, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(290, 10, 93, 28))
        self.pushButton_3.setObjectName("pushButton_3")

        self.label = QtWidgets.QTextBrowser(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(420, 10, 93, 28))
        self.label.setObjectName("label")


        self.label1 = QtWidgets.QTextBrowser(self.centralwidget)
        self.label1.setGeometry(QtCore.QRect(20, 60, 1071, 71))
        self.label1.setObjectName("label1")
        self.label2 = QtWidgets.QLabel(self.centralwidget)
        self.label2.setGeometry(QtCore.QRect(40, 190, 481, 421))
        self.label2.setObjectName("label2")
        self.label3 = QtWidgets.QLabel(self.centralwidget)
        self.label3.setGeometry(QtCore.QRect(600, 200, 461, 381))
        self.label3.setObjectName("label3")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1128, 26))
        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)
        # self.image_path = ''

    def retranslateUi(self, MainWindow):# 设置界面各个组件的文本内容。
        # text_dis = ''
        _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", "{}".format(text_dis)))
        self.label2.setText(_translate("MainWindow", "CSDN:积极向上的Mr.d"))
        self.label3.setText(_translate("MainWindow", "CSDN:积极向上的Mr.d"))

    def showEnvironment(self):    # 退出
        sys.exit()


    def uploadImage(self):
            file_dialog = QFileDialog()
            image_path, _ = file_dialog.getOpenFileName(self, '选择图片', '', 'Images (*.png *.xpm *.jpg *.bmp *.mp4)')
            self.image_path = image_path
            if image_path:
                pixmap = QtGui.QPixmap(image_path)
                self.label2.setPixmap(pixmap)
                self.label2.setScaledContents(True)
                # 加载图片的逻辑保持不变

    # global text_dis
    def startProgram(self):
        text_dis_list = []  # 用于存储每次循环中的 text_dis 值
        if self.image_path.endswith('.mp4'):
            # 如果是视频文件,使用视频流而不是单个图像
            cap = cv2.VideoCapture(self.image_path)
            frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            fps = int(cap.get(cv2.CAP_PROP_FPS))
            out = cv2.VideoWriter('result.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_width, frame_height))
            model = YOLO('yolov8n.pt')

            while True:
                ret, frame = cap.read()
                if not ret:
                    break

                # 对每一帧运行对象检测
                results = model(frame)
                annotated_frame = results[0].plot()
                boxes = results[0].boxes.xywh.cpu()
                for i, box in enumerate(boxes):
                    # for box, class_idx in zip(boxes, classes):
                    x_center, y_center, width, height = box.tolist()
                    x1 = x_center - width / 2
                    y1 = y_center - height / 2
                    x2 = x_center + width / 2
                    y2 = y_center + height / 2
                    h = y2 - y1
                    dis_m = person_distance(h)
                  
                    text_dis_list.append(dis_m)
                    max_dis_m = min(text_dis_list)
                    # global text_dis
                    if max_dis_m < 2:
                        text_dis = '高风险'
                    elif max_dis_m > 5:
                        text_dis = '低风险'
                    else:
                        text_dis = '中风险'
                # text_dis_list.append(text_dis)
                    self.label.setText(text_dis)
                # 将检测结果写入输出视频流
                out.write(annotated_frame)
                # 将结果显示在label3中(可选)
                rgb_annotated_frame = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
                # 使用QImage将RGB图像转换为Qt格式
                height, width, channel = rgb_annotated_frame.shape
                bytes_per_line = channel * width
                q_img = QImage(rgb_annotated_frame.data, width, height, bytes_per_line, QImage.Format_RGB888)
                # 将QImage转换为QPixmap并显示在label3中
                pixmap = QPixmap.fromImage(q_img)
                # pixmap = QtGui.QPixmap.fromImage(QtGui.QImage(annotated_frame.data, annotated_frame.shape[1], annotated_frame.shape[0], QtGui.QImage.Format_RGB888))
                self.label3.setPixmap(pixmap)
                self.label3.setScaledContents(True)

                cv2.waitKey(1)

            cap.release()
            out.release()

        else:
            # 如果是单个图像文件,保持原始逻辑不变
            self.label1.setText(self.image_path)
            model = YOLO('yolov8n.pt')
            results = model(self.image_path)
            annotated_frame = results[0].plot()
            boxes = results[0].boxes.xywh.cpu()
            for i, box in enumerate(boxes):
                # for box, class_idx in zip(boxes, classes):
                x_center, y_center, width, height = box.tolist()
                x1 = x_center - width / 2
                y1 = y_center - height / 2
                x2 = x_center + width / 2
                y2 = y_center + height / 2
                h = y2 - y1
                dis_m = person_distance(h)
                if dis_m < 2:
                    text_dis = '高风险'
                elif dis_m > 5:
                    text_dis = '低风险'
                else:
                    text_dis = '中风险'
                self.label.setText(text_dis)
            cv2.imwrite("result.jpg",annotated_frame)
            pixmap = QtGui.QPixmap("result.jpg")
            self.label3.setPixmap(pixmap)
            self.label3.setScaledContents(True)
        return text_dis



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

4.2 界面卡住解决方案

如果点击图片检测或者视频检测按钮卡住,大概律师代码中间出现了错误,这时候是看不到报错的,具体可以把以下这个功能打开,这样就可以看到报错
请添加图片描述
请添加图片描述

5. 实现效果

显示界面
请添加图片描述
检测图片
请添加图片描述
检测视频
请添加图片描述

工程源码下载:YOLOV8 + PYQT5单目测距(风险类别检测)
解压密码:csdn:mr.d

文章内容后续会慢慢完善…

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

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

相关文章

【Python】 已解决:ValueError: document with multiple roots

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ValueError: document with multiple roots 一、分析问题背景 在Python编程中&#xff0c;处理XML或HTML文档时&#xff0c;有时会遇到“ValueError: document …

安防监控视频平台LntonAIServer视频智能分析平台行人入侵检测算法

在当今社会&#xff0c;随着科技的迅速发展和安全需求的日益增长&#xff0c;行人入侵检测技术成为了安全防护领域的重要研究方向。LntonAIServer行人入侵检测算法作为该领域的先进技术之一&#xff0c;其性能和应用效果受到了广泛关注。 首先&#xff0c;从技术角度来看&#…

【线程安全】线程互斥的原理

文章目录 Linux线程互斥线程互斥相关概念互斥量mutex引出线程并发问题引出互斥锁、互斥量 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁使用互斥锁抢票 可重入和线程安全概念&#xff1a;常见线程不安全的情况常见线程安全的情况常见不可重入的情况常见可重入情况可重入…

中霖教育怎么样?中级经济师证书领取流程介绍

在成功通过中级经济师考试之后&#xff0c;需要等待约2到3个月的时间&#xff0c;会发布相关领证公告。 在准备材料方面&#xff0c;考生需确保携带以下文件&#xff1a;身份证件、学历证明以及工作年限的证明文件等&#xff0c;前往相应的人事考试局进行资格审核。 资格审核…

探索交通安全新前沿:构建全面精准的交通事故数据集(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 在21世…

Redis基础教程(十八):Redis管道技术

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

tomcat 安装和优化

tomcatat tomcat和http一样&#xff0c;都是用来处理动态页面的 tomcat也可以作为web服务器&#xff0c;开源的 php.php tomcat.jsp nginx.html tomcat使用java代码写的程序&#xff0c;运行的是java的web服务程序 tomcat的特点和功能&#xff1a; 1、servlet容器&…

【硬核科普】Ubuntu系统详细解析以及与深度学习的关系

文章目录 0. 前言1. Ubuntu的来源1.1 从Linux说起1.2 开源、稳定的Debian1.3 更稳定、友好且开放的Ubuntu 2. Ubuntu与深度学习3. Ubuntu在自动驾驶领域的应用4. 附录&#xff1a;Linux发行版统计 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理…

白蛇插画:成都亚恒丰创教育科技有限公司

白蛇插画&#xff1a;古韵今风&#xff0c;情深意长 在浩瀚的艺术长河中&#xff0c;插画作为一种独特的艺术形式&#xff0c;以其生动形象的画面、丰富多彩的色彩和深邃悠远的意境&#xff0c;成都亚恒丰创教育科技有限公司深受人们喜爱。而“白蛇插画”&#xff0c;作为融合…

图像识别和目标检测在超市电子秤上的应用

目录 前言深度学习的目标检测图像识别技术视觉秤的优势其他应用场景中的技术应用未来展望 前言 随着科技的不断发展&#xff0c;电子秤在生鲜超市中的应用也在不断升级。传统的电子秤需要打秤人员手动输入秤码&#xff0c;这不仅耗时费力&#xff0c;还需要大量的培训以记住各…

Zabbix 6.0 组件 工作原理和组件

Zabbix组件 C/S架构 服务端&#xff1a;zabbix server&#xff08;端口10051&#xff09;&#xff1a;zabbix服务端进程&#xff0c;用于接收代理端发来的监控指标数据&#xff0c;配置和管理zabbix应用程序&#xff0c;也是监控系统的告警中心&#xff08;通过监控项告警触…

将亚马逊甩在身后的Flipkart在印度加速狂奔,Flipkart中国卖家怎么入驻开店?

Flipkart创立于2007年&#xff0c;是印度第一大电商平台&#xff0c;发展势头可谓十分迅猛&#xff0c;在印度就连亚马逊都被它远远地甩在了身后。除了销售图书和电子产品&#xff0c;Flipkart还有一个在线市场&#xff0c;允许第三方卖家入驻销售产品。 将亚马逊甩在身后的Fli…

基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台

复旦微可以配合的ARM平台有&#xff1a;RK3588/TI AM62X/ NXP IMX.8P/飞腾FT2000等。 产品概述 基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用复旦微的JFM7K325T FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具…

ArkUI开发学习随机——B站视频简介页面,美团购买界面

案例一&#xff1a;B站视频简介页面 代码&#xff1a; build() {Column(){Column(){Stack(){Image($r("app.media.genimpact")).width(200).height(125).borderRadius({topLeft:5,topRight:5})Row(){Image($r("app.media.bz_play")).height(24).fillColor…

游戏AI的创造思路-技术基础-决策树(1)

决策树&#xff0c;是每个游戏人必须要掌握的游戏AI构建技术&#xff0c;难度小&#xff0c;速度快&#xff0c;结果直观&#xff0c;本篇将对决策树进行小小解读~~~~ 目录 1. 定义 2. 发展历史 3. 决策树的算法公式和函数 3.1. 信息增益&#xff08;Information Gain&…

阿尔泰科技与西安交通大学陕西省某技术重点实验室共谋未来!

近日&#xff0c;阿尔泰科技的电子工程师&#xff08;熊工&#xff09;应邀前往西安交通大学陕西省某技术重点实验室&#xff0c;参与课题组项目的测试与调试工作。此次合作不仅成功推动了项目的进展&#xff0c;还为未来的深入合作奠定了坚实基础。 阿尔泰科技作为领先的测控技…

本地部署 Llama3 – 8B/70B 大模型!

Llama3&#xff0c;作为Meta公司新发布的大型语言模型&#xff0c;在人工智能领域引起了广泛的关注。特别是其8B&#xff08;80亿参数&#xff09;版本&#xff0c;在性能上已经超越了GPT-3.5&#xff0c;而且由于是开源的&#xff0c;用户可以在自己的电脑上进行部署。 本文和…

AI in Healthcare 医疗领域AI应用-基于DeepNLP AI App Store 真实用户评论打分和排名

website: Best AI in Healthcare DeepNLP AI Store github: https://rockingdingo.github.io/ai_store 医疗健康(AI in Healthcare)领域哪些AI服务应用更能满足用户的需求&#xff0c;排名最高? 参考deepnlp.org网站根据用户真实评论打分和show case分享&#xff0c;分为下列…

光敏电阻,光敏三极管,光敏二极管的作用与区别

光敏电阻、光敏三极管和光敏二极管的作用与区别 光敏电阻(Photocell/Photoresistor) 作用: 光敏电阻是一种对光敏感的电阻器,当光线照射到它时,其电阻会发生变化。它的主要作用包括: 光感应:用来检测环境光强度的变化。光控开关:在自动化控制中,根据光强变化实现开关…

商家转账到零钱分销返佣场景驳回处理办法

在处理商家转账到零钱分销返佣场景被驳回的问题时&#xff0c;商家需要了解驳回的原因&#xff0c;并采取相应的措施来解决这些问题。下面将详细介绍几种常见的驳回原因以及应对策略&#xff1a; 1. 多级分销模式问题 • 原因&#xff1a;如果业务模式涉及多级分销&#xff0c;…