基于YOLO与自定义Tkinter的车流量统计系统设计
1. 需求介绍和功能展示
车流量数据是交通态势感知、信号灯配时优化、道路拥堵预警的核心依据。传统的线圈检测、雷达检测存在安装维护成本高、易受环境干扰等缺陷。近年来,基于深度学习的视觉检测方法因成本低、部署灵活而备受关注。
本文以yolo26n为检测基座,开发了一款轻量级、可交互的车流量统计桌面应用。系统核心功能包括:
- 视频文件导入与实时播放(支持暂停/继续)
- YOLO模型动态切换
- 基于车辆中心点跟踪的穿越计数
- 鼠标点击交互式计数线设置
- 统计信息(累计车辆数、当前时间)展示
系统采用CustomTkinter + OpenCV + Ultralytics YOLO技术栈,兼顾性能与用户体验。

2. 系统总体设计
2.1 功能模块划分
系统功能模块如图1所示(此处略),主要包含:
- 视频管理模块:负责打开、读取、释放视频文件,获取视频尺寸与帧率。
- 模型管理模块 :加载YOLO模型(默认
yolo26n.pt),支持用户通过文件对话框选择其他.pt模型并热加载。 - 目标检测模块:对每一帧执行YOLO推理,提取车辆边界框及类别。
- 跟踪与计数模块:基于IoU或中心点距离匹配同一车辆在相邻帧的位置,判断车辆是否跨越预设计数线,累计通过车辆数。
- 交互控制模块:提供开始、暂停、继续、重置计数、设置计数线等按钮,并监听鼠标事件完成计数线绘制。
- 显示模块:在Canvas区域实时展示带检测框、计数线和统计面板的视频帧,同时左侧面板同步刷新累计车次和系统时间。
2.2 技术架构
- 前端界面 :使用
customtkinter构建圆角控件、浅色主题,模拟macOS风格。 - 视频处理 :
opencv-python负责视频解码、图像预处理及画图。 - 深度学习推理 :
ultralyticsYOLO接口,支持CPU/GPU推理。 - 辅助库 :
Pillow处理中文文字渲染,numpy进行数值计算,threading实现模型后台加载。
系统整体流程图如下:
导入视频 → 加载模型 → 播放循环 → 读取帧 → YOLO检测 → 跟踪匹配 → 计数线交叉判断 → 绘制结果 → 显示/更新统计
3. 关键算法与实现
3.1 目标检测
采用yolo26n模型,输入图像尺寸为640×640,检测类别包含car、truck、bus、motorcycle、bicycle五类车辆。推理输出为边界框坐标[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
注:本文介绍的软件完整代码可向作者索取。