【YOLO系列】基于YOLOv8/v11/v26与tkinter的车流量统计系统设计

基于YOLO与自定义Tkinter的车流量统计系统设计

1. 需求介绍和功能展示

车流量数据是交通态势感知、信号灯配时优化、道路拥堵预警的核心依据。传统的线圈检测、雷达检测存在安装维护成本高、易受环境干扰等缺陷。近年来,基于深度学习的视觉检测方法因成本低、部署灵活而备受关注。

本文以yolo26n为检测基座,开发了一款轻量级、可交互的车流量统计桌面应用。系统核心功能包括:

  • 视频文件导入与实时播放(支持暂停/继续)
  • YOLO模型动态切换
  • 基于车辆中心点跟踪的穿越计数
  • 鼠标点击交互式计数线设置
  • 统计信息(累计车辆数、当前时间)展示

系统采用CustomTkinter + OpenCV + Ultralytics YOLO技术栈,兼顾性能与用户体验。

2. 系统总体设计

2.1 功能模块划分

系统功能模块如图1所示(此处略),主要包含:

  1. 视频管理模块:负责打开、读取、释放视频文件,获取视频尺寸与帧率。
  2. 模型管理模块 :加载YOLO模型(默认yolo26n.pt),支持用户通过文件对话框选择其他.pt模型并热加载。
  3. 目标检测模块:对每一帧执行YOLO推理,提取车辆边界框及类别。
  4. 跟踪与计数模块:基于IoU或中心点距离匹配同一车辆在相邻帧的位置,判断车辆是否跨越预设计数线,累计通过车辆数。
  5. 交互控制模块:提供开始、暂停、继续、重置计数、设置计数线等按钮,并监听鼠标事件完成计数线绘制。
  6. 显示模块:在Canvas区域实时展示带检测框、计数线和统计面板的视频帧,同时左侧面板同步刷新累计车次和系统时间。

2.2 技术架构

  • 前端界面 :使用customtkinter构建圆角控件、浅色主题,模拟macOS风格。
  • 视频处理opencv-python负责视频解码、图像预处理及画图。
  • 深度学习推理ultralytics YOLO接口,支持CPU/GPU推理。
  • 辅助库Pillow处理中文文字渲染,numpy进行数值计算,threading实现模型后台加载。

系统整体流程图如下:

复制代码
导入视频 → 加载模型 → 播放循环 → 读取帧 → YOLO检测 → 跟踪匹配 → 计数线交叉判断 → 绘制结果 → 显示/更新统计

3. 关键算法与实现

3.1 目标检测

采用yolo26n模型,输入图像尺寸为640×640,检测类别包含cartruckbusmotorcyclebicycle五类车辆。推理输出为边界框坐标[x1, y1, x2, y2]、置信度及类别标签。代码实现:

python 复制代码
results = model(frame, stream=False)
boxes = results[0].boxes.xyxy.cpu().numpy()

3.2 车辆跟踪与去重计数

为准确统计通过计数线的车辆数,需避免同一车辆被多次计数。系统采用基于中心点的欧氏距离追踪策略:

  • 每帧计算每个车辆的中心点 (cx, cy)
  • 维护全局字典vehicle_tracker,存储车辆ID → 上一帧中心点
  • 当前帧每个车辆与上一帧所有车辆比较距离,若小于阈值(50像素),则认为跟踪成功,继承原ID;否则分配新ID。
  • 当车辆ID首次从计数线一侧移动到另一侧时,total_vehicles加1,并将该ID记录到vehicles_counted集合中防止重复计数。

计数线交叉判断使用向量叉积法 :检查线段(last_pos, pos)是否与计数线(line_start, line_end)相交。

python 复制代码
def line_crossed(p1, p2, line_start, line_end):
    # 计算叉积判断相交
    ...
    return 0 <= t1 <= 1 and 0 <= t2 <= 1

3.3 交互式计数线设置

传统方法需在代码中硬编码坐标,不便于不同视频的适配。本系统允许用户在播放或暂停状态下,点击"设置计数线"按钮,随后在视频画面上点击两个点,由程序自动计算原始视频坐标系下的坐标并存储。

坐标映射:Canvas显示区域对原视频等比例缩放并居中,鼠标点击坐标需通过比例尺和偏移量反算回原始帧坐标。

python 复制代码
scale = min(canvas_w/orig_w, canvas_h/orig_h)
disp_w, disp_h = int(orig_w*scale), int(orig_h*scale)
offset_x = (canvas_w - disp_w) // 2
orig_x = int((mouse_x - offset_x) / scale)

该设计极大提升了系统的易用性和通用性。

3.4 播放速度控制

通过调节after方法的延迟时间控制帧率。用户可输入1‑60 FPS,系统动态更新frame_delay = 1000 / playback_fps

4. 图形用户界面设计

界面遵循macOS风格,浅灰色背景、圆角按钮、蓝色强调色。左侧面板包含所有控制选项,右侧Canvas区域用于视频展示。状态栏实时反馈操作信息。

主要控件及功能:

控件 功能
导入视频 选择本地视频文件
开始 从头播放视频并开始检测计数
暂停/继续 控制播放进程
设置计数线 进入鼠标点选模式,定义计数线的起点与终点
清除计数线 删除当前计数线并重置计数
播放速度 调节视频播放速率
YOLO模型 选择并加载新的.pt模型文件
累计通过 实时显示通过计数线的车辆总数
当前时间 显示系统时间

5. 实验与结果

5.1 实验环境

  • 硬件:Intel Core i7‑10750H, 16GB RAM, NVIDIA GTX 1650
  • 软件:Windows 11, Python 3.14, CUDA 12.1
  • 测试视频:道路监控录像,时长2分钟,分辨率1920×1080,帧率30 FPS

5.2 检测与计数性能

在默认yolo26n.pt模型下,推理速度约25‑30 FPS(GPU),满足实时处理需求。计数准确率人工抽样验证:车辆通过计数线实际数量为87辆,系统统计84辆,准确率96.6%。误差主要源于极少数车辆被短暂遮挡导致跟踪中断后重新分配新ID,造成重复计数。

5.3 交互体验

"设置计数线"功能可将操作时间从修改代码配置的2‑3分钟缩短至10秒内,显著提升了不同视频场景的适配效率。播放速度调节功能便于慢放分析密集车流。

6. 结论与展望

本文成功开发了一套基于YOLO和Python桌面框架的车流量统计系统,具备视频处理、目标检测、跟踪计数、交互式线设置等实用功能。系统界面友好,操作简单,能够为交通流量调研提供低成本、高效率的辅助工具。

未来工作可从以下方向改进:

  • 引入Deep SORT等更鲁棒的跟踪算法,减少遮挡造成的ID跳变。
  • 增加多计数线支持,统计不同车道的流量。
  • 添加车辆速度估算与报表导出功能。
  • 优化模型量化加速,适配边缘计算设备。

关键词:车流量统计;YOLO;目标跟踪;交互式界面;CustomTkinter

注:本文介绍的软件完整代码可向作者索取。

相关推荐
weixin_398187751 小时前
YOLOv11改进:全维度动态卷积ODConv与C3k2模块创新
人工智能·yolo
szial1 小时前
Python Click 教程:从函数到专业命令行工具
开发语言·python
u0119608231 小时前
ray 依赖分发
python
这张生成的图像能检测吗1 小时前
(论文速读)SPR-YOLO:面向模糊场景的轻量级交通流检测算法
人工智能·yolo·计算机视觉·目标追踪
lbb 小魔仙1 小时前
Ollama 本地部署大模型 + Python API 集成开发完整教程(2026最新版,含 GPU 加速配置)
开发语言·python
DanCheng-studio2 小时前
毕设分享 深度学习遮挡下的人脸识别(源码+论文)
python·毕业设计·毕设
小妖同学学AI2 小时前
告别手动盯盘!开源框架Freqtrade,教你用Python打造“永不下班”的AI交易员
人工智能·python·开源
xxjj998a2 小时前
PHP vs Go vs Python:三大语言终极对比
python·golang·php
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月5日
人工智能·python·信息可视化·自然语言处理·ai编程