python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)

news2025/5/19 7:22:20

文章目录

  • 一.前言
  • 二.效果预览
    • 1.目标识别与检测
    • 2.可视化展示
      • 1.车流量统计
      • 2. 目标类别占比
      • 3. 拥堵情况展示
      • 4.目标数量可视化
    • 3.控制台
    • 4.核心内容区
      • 1.目标检测参数
      • 2.帧转QPixmap
      • 3.数据管理
    • 5.项目结构
  • 三.总结


请添加图片描述
平台规定gif最大5M,所以压缩了一下,见谅!

一.前言

本次使用PyQt5+YOLOv8开发一款“智慧交通分析平台”,使用YOLOv8检测监控画面中的车辆和行人,将检测到的画面进行绘制、标注、统计,最后展示到画面中央,主屏右侧操作区域可以控制绘制结果。

二.效果预览

请添加图片描述

1.目标识别与检测

本系统使用YOLOv8对目标进行识别与检测

YOLOv8是Ultralytics公司推出的最新一代实时目标检测算法,基于YOLO(You Only Look Once)系列架构改进,具有更高的检测精度和更快的推理速度。它支持目标检测、实例分割和图像分类任务,采用灵活的Backbone和Neck设计,并优化了训练策略与损失函数,兼容多种部署环境(如ONNX、TensorRT等),适合工业级应用。YOLOv8提供多种预训练模型(从轻量级YOLOv8n到高性能YOLOv8x),平衡速度与精度,是计算机视觉领域的先进工具之一。

在这里插入图片描述
本次使用YOLOv8版本对车辆和行人进行识别,车辆的类型包括:小汽车、摩托车、自行车、卡车,行人就是马路上行走的人,系统采用队列对读取到的视频流帧进行处理,标注分析好之后使用信号的方式发射给PyQt5的前端,前端设置槽函数接收、处理、展示数据。

2.可视化展示

本系统使用pyecharts对上游数据进行可视化展示

Pyecharts 是基于 Python 的数据可视化库,依托强大的 ECharts(百度开源 JavaScript 图表库)构建,提供丰富的交互式图表类型(如折线图、柱状图、散点图、地图等)。它支持链式调用和简洁的 API 设计,可轻松生成动态、可缩放的可视化结果,并兼容 Jupyter Notebook、Web 页面及 Flask/Django 等框架。Pyecharts 支持多种数据格式(如 Pandas、NumPy),允许自定义样式和主题,适用于数据分析、商业报表和实时大屏展示,是 Python 生态中高效、美观的可视化工具之一。

图片取自网络,仅用于echarts图效果展示,不包含在本系统中。
在这里插入图片描述

展示的维度包括:

1.车流量统计

把时间作为横轴,纵轴是具体的数值,采用折线堆叠图展示可视化分析结果
在这里插入图片描述

2. 目标类别占比

对检测到的目标类别以及数量,采用圆环饼图进行可视化展示,图例中为全部目标物体

在这里插入图片描述

3. 拥堵情况展示

对于当前道路的拥堵情况采用算法动态计算当前道路的拥堵情况,采用水球图展示当前道路拥堵情况
在这里插入图片描述

具体来说是使用echarts图配合QWebEngineView来展示存储在内存中的html代码,
这里分享我遇到的一个坑,就是如何设置QWebEngineView隐藏右击菜单:
直接重写QWebEngineView,实现其中的contextMenuEvent方法,忽略这个事件,代码我贴在下面啦

class NoContextMenuWebEngineView(QWebEngineView):
	def __init__(self, parent=None):
		super().__init__(parent)

	def contextMenuEvent(self, event: QContextMenuEvent):
		# 忽略右键点击事件,彻底禁用右键菜单
		event.ignore()

还有一个就是如何让echarts图背景透明,类似于下面这种效果:
在这里插入图片描述
这里不卖关子,直接下面三行代码实现:

self.view.setAttribute(Qt.WA_TranslucentBackground, True)
self.view.setStyleSheet("background: transparent;")
self.view.page().setBackgroundColor(Qt.transparent)

4.目标数量可视化

这里我们使用了自定义组件,自定义组件是垂直布局,顶部是当前类别的数量,中间是当前类别文字说明,底部是当前类别可视化图像,用户可以直观地看到具体类别的具体数据,因为目标类别的类别数量是确定的,这里我们直接就直接绘制好了效果。
在这里插入图片描述

3.控制台

控制台区域分为三个部分,分别是拉流控制、视频帧控制、标签显示内容控制,这里我们使用了自定义组件-开关组件能够方便地和用户交互,交互的结果直接呈现在中间内容区域中,同时用户可以控制标签中的展示项目的显隐。
在这里插入图片描述

4.核心内容区

这个区域是本系统的核心部分,主要是对输入的rtmp、rtsp流的帧画面进行视觉分析,使用多线程的方式在线程中处理视频画面数据,然后使用cv2对图像进行绘制,再使用信号的方式将处理结果发射到主线程中,主线程界面接收到数据将画面、可视化结果展示。
下面我引用一下AI的分析原话:

VideoProcessingThread 是一个基于 PyQt5 的 QThread 子类,专为实时视频流处理设计,集成了 YOLOv8 目标检测与追踪功能。它通过多线程架构实现高效帧处理:主线程负责从 RTMP 流异步读取帧,子线程使用 YOLOv8 模型进行目标检测、追踪(支持车辆/行人等类别),并计算运动轨迹与速度(含超速判断)。类内维护三个线程安全队列(原始帧、渲染帧、统计结果),通过 frame_ready 信号实时推送渲染后的帧(含边界框、轨迹线、标签等可视化元素),同时支持动态流切换、断线重连及 GPU 加速(自动切换 FP16 模式)。该类封装了完整的视频分析流水线,适用于智能交通监控等实时视觉应用,并通过模块化设计允许灵活配置检测参数与绘制选项。
在这里插入图片描述

在这里插入图片描述

1.目标检测参数

本次使用枚举类对目标检测参数进行设置,我在这里贴出来,这些参数主要是给目标检测线程类使用,每个变量都是有注释的。


class Config(Enum):
	# RTMP 流地址:替换为实际的视频流地址(来自摄像头或推流服务器)
	RTMP_STREAM_URL = 'rtmp://192.168.99.199/stream/cam1'

	# YOLO 模型文件名,可为 yolov8s.pt、yolov8n.pt 等,需确保文件存在
	MODEL_NAME = 'yolov8s.pt'

	# 每个跟踪对象保存的历史帧数,用于计算速度(历史越多越稳定,但更耗内存)
	MAX_TRACK_HISTORY = 5

	# 估算用的像素与实际距离的换算比例(单位:米/像素),用于速度换算
	METERS_PER_PIXEL = 0.05

	# 超速阈值(单位:km/h),超过该速度将高亮显示为红色
	OVERSPEED_THRESHOLD = 30

	# 当无法从视频流中获取 FPS 时使用的默认帧率
	DEFAULT_FPS = 25

	# 框标签文字的缩放比例(影响标签大小)
	LABEL_FONT_SCALE = 0.5

	# 标签边框线的粗细(单位:像素),需为整数
	THICKNESS = 1

	# 使用的字体类型(OpenCV 字体)
	FONT = cv2.FONT_HERSHEY_SIMPLEX

	# 每行标签文字之间的间距(单位:像素)
	LINE_SPACING = 5

	# 标签信息背景透明度(前景图层 alpha 值,范围 0.0 - 1.0)
	OVERLAY_ALPHA = 0.65

	# 标签信息背景透明度(背景图层 beta 值,1 - alpha)
	OVERLAY_BETA = 0.35
	FRAME_QUEUE_SIZE = 60
	FRAME_SKIP = 2  # 每 2 帧推理一次,可根据设备调整


2.帧转QPixmap

我们通过cv2拿到视频帧之后是无法直接展示在界面上的,这就需要用到帧转QPixmap了,这里我封装好一个方法给大家,直接调用就能够实现帧转QPixmap!

def frame_to_pix(frame):
	rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
	h, w, ch = rgb_frame.shape
	bytes_per_line = ch * w
	qt_image = QImage(rgb_frame.data, w, h, bytes_per_line, QImage.Format_RGB888)
	return QPixmap.fromImage(qt_image)

3.数据管理

我们使用单例模式定义了一个DataManager类,这个类能够帮我们动态管理YOLOv8分析后的结果,很方便地在其他类、函数里使用,这里介绍一下单例模式

Python 单例模式(Singleton Pattern) 是一种设计模式,确保一个类仅有一个实例,并提供全局访问点。通常通过重写 new 方法或使用装饰器、元类等方式实现,适用于需要全局唯一对象的场景(如配置管理、日志记录、数据库连接池等)。Python 的模块导入机制天然支持单例(模块在首次导入时缓存),但显式实现可通过类变量存储实例,并在实例化时检查是否已存在,避免重复创建,从而保证系统资源的高效利用和状态一致性。在这里插入图片描述

DataManager 是一个数据管理类,用于维护和操作结构化键值数据(如统计图表数据)。它基于 system_conf.base_chart_data 初始化,支持深拷贝原始数据以避免共享问题。核心功能包括:

  1. 数据更新:提供单键更新(update)和批量更新(batch_update),支持绝对赋值或累加模式,自动过滤非法键并补全缺失键为默认值
  2. 数据查询:可获取单个键的值(get)、中文标签(get_label)或完整数据副本(get_all,确保包含所有默认键)
  3. 数据维护:支持重置所有值为零(reset)、检查键存在(has_key)及删除键(remove
  4. 容错设计:自动处理未定义键(返回0或空字符串),并通过警告日志提示无效操作
    该类通过全局实例 dataManager 提供统一的数据管理入口,适用于需要动态维护标准化数据集合的场景(如实时数据可视化、状态监控等),确保数据完整性和操作安全性。

5.项目结构

本项目在Python3.8环境下开发,依赖pyqt5==5.15.2版本。
本项目是基于YOLOv8的项目,检测模型为yolov8s.pt,这个模型位于./data/models/目录下面,大家可以自行替换自己训练的模型,软件整体的代码文件结构为:
我相信,有下面的示意图,大家能很快的上手本项目!

在这里插入图片描述

三.总结

本次和大家分享了我使用PyQt5+YOLOv8开发的智慧交通分析平台,有图有文字,详细地介绍了系统以及具体功能实现,但是我认为博客仍然不够直观,大家还是亲自体验比较好!
需要代码可以私聊我,但是CSDN我不经常在,大家可以点击下面的链接加我WX,必定全力支持!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux任务管理与守护进程

一、任务管理 (一)进程组、作业、会话概念 (1)进程组概念:进程组是由一个或多个进程组成的集合,这些进程在某些方面具有关联性。在操作系统中,进程组是用于对进程进行分组管理的一种机制。每个…

C#里与嵌入式系统W5500网络通讯(2)

在嵌入式代码里,需要从嵌入式的MCU访问W5500芯片。 这个是通过SPI通讯来实现的,所以要先连接SPI的硬件通讯线路。 接着下来,就是怎么样访问这个芯片了。 要访问这个芯片,需要通过SPI来发送数据,而发送数据又要有一定的约定格式, 于是芯片厂商就定义下面的通讯格式: …

EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT,需要搭建一个MQTT服务器,所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的,在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了,所以…

【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统

GraspPicture 项目深度解析:基于图像分割的抓取点检测系统 一、项目概述项目特点 二、项目运行方式与执行步骤(一)环境准备(二)项目结构(三)执行步骤 三、重要逻辑代码解析(一&#…

MySQL 数据库备份与还原

作者:IvanCodes 日期:2025年5月18日 专栏:MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: 🎯 备份是指创建数据的副本并将其存储在不同位置或介质,主要目的是在发生数据丢失、损坏或逻辑错误时进…

Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现

云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…

javax.servlet.Filter 介绍-笔记

1.javax.servlet.Filter 简介 javax.servlet.Filter 是 Java Servlet API 中的一个核心接口,用于在请求到达目标资源(如 Servlet 或 JSP)之前或响应返回给客户端之前执行预处理或后处理操作。它常用于实现与业务逻辑无关的通用功能&#xff…

Win 11开始菜单图标变成白色怎么办?

在使用windows 11的过程中,有时候开始菜单的某些程序图标变成白色的文件形式,但是程序可以正常打开,这个如何解决呢? 这通常是由于快捷方式出了问题,下面跟着操作步骤来解决吧。 1、右键有问题的软件,打开…

入门OpenTelemetry——应用自动埋点

埋点 什么是埋点 埋点,本质就是在你的应用程序里,在重要位置插入采集代码,比如: 收集请求开始和结束的时间收集数据库查询时间收集函数调用链路信息收集异常信息 这些埋点数据(Trace、Metrics、Logs)被…

C语言链表的操作

初学 初学C语言时,对于链表节点的定义一般是这样的: typedef struct node {int data;struct node *next; } Node; 向链表中添加节点: void addNode(Node **head, int data) {Node *newNode (Node*)malloc(sizeof(Node));newNode->dat…

芯片生态链深度解析(二):基础设备篇——人类精密制造的“巅峰对决”

【开篇:设备——芯片工业的“剑与盾”】 当ASML的EUV光刻机以每秒5万次激光脉冲在硅片上雕刻出0.13nm精度的电路(相当于在月球表面精准定位一枚二维码),当国产28nm光刻机在华虹产线实现“从0到1”的突破,这场精密制造…

C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用

目录 一、const修饰指针 (一)const修饰变量 (二)const 修饰指针变量 二、野指针 (一)野指针成因 1、指针未初始化 2、指针越界访问 3、指针指向的空间释放 (二)如何规避野指…

【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言常用的EditorGUILayout控件专栏推荐完结 前言 EditorG…

Linux基础第三天

系统时间 date命令,date中文具有日期的含义,利用该命令可以查看或者修改Linux系统日期和时间。 基本格式如下: gecubuntu:~$ date gecubuntu:~$ date -s 日期时间 // -s选项可以设置日期和时间 文件权限 chmod命令,是英文…

MoodDrop:打造一款温柔的心情打卡单页应用

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念:我想做一款温柔的情绪应用 「今天的你,心情如何?」 有时候&#x…

接口——类比摄像

最近迷上了买相机,大疆Pocket、Insta Go3、大疆Mini3、佳能50D、vivo徕卡人像大师(狗头),在买配件的时候,发现1/4螺口简直是神中之神,这个万能接口让我想到计算机设计中的接口,遂有此篇—— 接…

二十、案例特训专题3【系统设计篇】web架构设计

一、前言 二、内容提要 三、单机到应用与数据分离 四、集群与负载均衡 五、集群与有状态无状态服务 六、ORM 七、数据库读写分离 八、数据库缓存Memcache与Redis 九、Redis数据分片 哈希分片如果新增分片会很麻烦,需要把之前数据取出来再哈希除模 一致性哈希分片是…

【数据结构与算法】ArrayList 与顺序表的实现

目录 一、List 接口 1.1 List 接口的简单介绍 1.1 常用方法 二、顺序表 2.1 线性表的介绍 2.2 顺序表的介绍 2.3 顺序表的实现 2.3.1 前置条件:自定义异常 2.3.2 顺序表的初始化 2.3.2 顺序表的实现 三、ArrayList 实现类 3.1 ArrayList 的两种使用方式 3.2 Array…

【图像处理基石】OpenCV中都有哪些图像增强的工具?

OpenCV 图像增强工具系统性介绍 OpenCV 提供了丰富的图像增强工具,主要分为以下几类: 亮度与对比度调整 线性变换(亮度/对比度调整)直方图均衡化自适应直方图均衡化(CLAHE) 滤波与平滑 高斯滤波中值滤波双…

WPS PPT设置默认文本框

被一个模板折磨了好久,每次输入文本框都是很丑的24号粗体还有行标,非常恶心,我甚至不知道如何描述自己的问题,非常憋屈,后来终于知道怎么修改文本框了。这种软件操作问题甚至不知道如何描述问题本身,非常烦…