当前位置: 首页 > news >正文

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

文章目录

  • 一.前言
  • 二.效果预览
    • 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.35FRAME_QUEUE_SIZE = 60FRAME_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.shapebytes_per_line = ch * wqt_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,必定全力支持!
在这里插入图片描述

相关文章:

  • 算法篇----二分查找
  • O2O电商变现:线上线下相互导流——基于定制开发开源AI智能名片S2B2C商城小程序的研究
  • #Redis黑马点评#(六)Redis当中的消息队列
  • k8s备份namespace
  • 多模态信息提取:打通数据价值的“最后一公里”
  • TDengine 在新能源领域的价值
  • 限流算法 + dfa敏感词过滤算法
  • MATLAB中的Switch语句讲解
  • 基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)
  • React Flow 边的基础知识与示例:从基本属性到代码实例详解
  • LLM笔记(九)KV缓存调研
  • std::is_same
  • 5月18总结
  • leetcode报错原因总结需要背下来的程序片 [更新中]
  • 三:操作系统线程管理之线程概念
  • 2025年全国青少年信息素养大赛C++小学全年级初赛试题
  • 逻辑与非逻辑的弥聚
  • 【Linux】第二十章 管理基本存储
  • 双紫擒龙紫紫红指标源码学习,2025升级版紫紫红指标公式-重点技术
  • 基于单片机路灯自动控制仪仿真设计
  • 九江银行落地首单畜牧业转型金融业务,助推传统农业绿色智能
  • 大学2025丨北大教授陈平原:当卷不过AI时,何处是归途
  • 出走的苏敏阿姨一路走到了戛纳,这块红毯因她而多元
  • 时隔三年,俄乌直接谈判重启
  • 刘小涛任江苏省委副书记
  • 中国首艘海洋级智能科考船“同济”号试航成功,可搭载水下遥控机器人