YOLOv8实时车速检测 车辆检测跟踪识别系统 车辆检测跟踪与实时车速检测系统 OpenCV 深度学习 毕业设计(建议收藏)✅
博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅
2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、项目介绍
技术栈:
python语言、PySide6、OpenCV和YOLOv8实时车速检测+车辆检测跟踪
本系统聚焦交通场景下的车辆监测需求,以 Python 为开发核心,整合 YOLOv8 目标检测、OpenCV 图像处理、PySide6 界面开发技术,构建集车辆检测、实时跟踪、车速计算于一体的智能系统,为交通流量管控、违章监测提供高效技术工具。
技术实现上,系统以 YOLOv8 作为车辆检测核心,凭借其高精度、高速度的检测优势,可快速识别画面中车辆目标并输出精准坐标,为后续跟踪与测速奠定基础;引入 OpenCV 完成图像预处理(如降噪、帧解析)与特征提取,优化视频流与摄像头实时画面的处理效率,确保车速计算的实时性;同时,通过 PySide6 搭建可视化交互界面,将检测结果、跟踪轨迹、车速数据直观呈现,用户可轻松操作图像 / 视频导入、参数调整等功能。
功能层面,系统核心能力分为两部分:一是车辆检测与跟踪,YOLOv8 精准定位车辆后,系统通过连续帧目标匹配实现稳定跟踪,即使面对车辆轻微遮挡场景,仍能维持轨迹连续性;二是实时车速检测,基于 OpenCV 计算车辆在连续帧中的位移,结合预设的像素距离与实际距离换算关系,精准推导实时车速,并在界面同步显示。
整体而言,系统通过多技术协同,既保障车辆检测的精度与跟踪的稳定性,又实现车速的实时计算与直观展示,操作便捷、响应迅速,可广泛应用于道路监控、停车场管理等场景,为交通智能化管理提供有力支撑。
2、项目界面
(1)车速检测车辆检测跟踪1

(2)车速检测车辆检测跟踪2
(3)车速检测车辆检测跟踪3
3、项目说明
1、运行test.py启动项目
2、环境: Python 3.8
3、可以替换成自己的视频来检测
test.py第22行
cap = cv2.VideoCapture(‘Vid1.mp4’) # 选择需要检测的视频
4、检测区域设置: test.py 第31行
area = [(225, 335), (803, 335), (962, 408), (57, 408)]
在代码中,检测区域通过定义一个多边形来表示,然后使用cv2.polylines()函数将其绘制在图像上。你可以修改area变量来定义你想要的检测区域。area是一个包含多边形各个顶点坐标的列表,你可以根据需要添加或修改这些坐标点来定义你想要的检测区域的形状和大小。
例如,如果你想要一个矩形检测区域,可以按照矩形的四个顶点顺序添加坐标点。如果你想要一个不规则形状的检测区域,可以添加更多的坐标点以定义多边形的形状。
以下是一个示例,展示了如何将一个矩形区域定义为检测区域:
定义矩形检测区域的四个顶点坐标
area = [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]
你需要将这些顶点坐标替换为你想要的实际坐标,并确保它们按照顺时针或逆时针顺序排列。然后,检测区域将根据这些顶点绘制在视频帧上,并在检测到的车辆进入该区域时进行相应处理。
4、核心代码
import cv2
import time
import numpy as np
from tracker import *
import pandas as pd
from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8s.pt')
def RGB(event, x, y, flags, param):
if event == cv2.EVENT_MOUSEMOVE:
colorsBGR = [x, y]
print(colorsBGR)
cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)
cap = cv2.VideoCapture('Vid2.mp4') # 选择需要检测的视频
my_file = open("coco.txt", "r")
data = my_file.read()
class_list = data.split("\n")
# print(class_list)
count = 0
speed = {}
area = [(225, 335), (803, 335), (962, 408), (57, 408)]
area_c = set()
# 跟踪算法
tracker = Tracker()
speed_limit = 62
while True:
ret, frame = cap.read()
if not ret:
break
count += 1
if count % 3 != 0:
continue
frame = cv2.resize(frame, (1020, 500))
results = model.predict(frame)
# print(results)
a = results[0].boxes.boxes
px = pd.DataFrame(a).astype("float")
# print(px)
list = []
# 使用YOLOv8的检测结果, 进行算法设计
for index, row in px.iterrows():
# print(row)
x1 = int(row[0])
y1 = int(row[1])
x2 = int(row[2])
y2 = int(row[3])
d = int(row[5])
c = class_list[d]
if 'car' in c:
list.append([x1, y1, x2, y2])
bbox_id = tracker.update(list)
for bbox in bbox_id:
x3, y3, x4, y4, id = bbox
cx = int(x3+x4)//2
cy = int(y3+y4)//2
results = cv2.pointPolygonTest(
np.array(area, np.int32), ((cx, cy)), False)
if results >= 0:
cv2.circle(frame, (cx, cy), 4, (0, 0, 255), -1)
cv2.putText(frame, str(id), (x3, y3), cv2.FONT_HERSHEY_COMPLEX,
0.8, (0, 255, 255), 2, cv2.LINE_AA)
cv2.rectangle(frame, (x3, y3), (x4, y4), (0, 0, 255), 2)
area_c.add(id)
now = time.time()
if id not in speed:
speed[id] = now
else:
try:
prev_time = speed[id]
speed[id] = now
dist = 2
a_speed_ms = dist / (now - prev_time)
a_speed_kh = a_speed_ms * 3.6
cv2.putText(frame, str(int(a_speed_kh))+'Km/h', (x4, y4),
cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 255), 2, cv2.LINE_AA)
speed[id] = now
except ZeroDivisionError:
pass
cv2.polylines(frame, [np.array(area, np.int32)], True, (0, 255, 0), 2)
cnt = len(area_c)
cv2.putText(frame, ('Vehicle-Count:-')+str(cnt), (452, 50),
cv2.FONT_HERSHEY_TRIPLEX, 1, (102, 0, 255), 2, cv2.LINE_AA)
cv2.imshow("RGB", frame)
if cv2.waitKey(1) & 0xFF == 27:
break
# 刷新,释放资源
cap.release()
cv2.destroyAllWindows()
import math
class Tracker:
def __init__(self):
# 存储目标的中心位置
self.center_points = {}
# ID计数
# 每当检测到一个新的目标id时, 计数将增加1
self.id_count = 0
def update(self, objects_rect):
# 目标的方框和ID
objects_bbs_ids = []
# 获取新目标的中心点
for rect in objects_rect:
x, y, w, h = rect
cx = (x + x + w) // 2
cy = (y + y + h) // 2
# 看看这个目标是否已经被检测到过
same_object_detected = False
for id, pt in self.center_points.items():
dist = math.hypot(cx - pt[0], cy - pt[1])
if dist < 35:
self.center_points[id] = (cx, cy)
# print(self.center_points)
objects_bbs_ids.append([x, y, w, h, id])
same_object_detected = True
break
# 检测到新目标,分配ID给新目标
if same_object_detected is False:
self.center_points[self.id_count] = (cx, cy)
objects_bbs_ids.append([x, y, w, h, self.id_count])
self.id_count += 1
# 按中心点清理字典, 删除不再使用的ID
new_center_points = {}
for obj_bb_id in objects_bbs_ids:
_, _, _, _, object_id = obj_bb_id
center = self.center_points[object_id]
new_center_points[object_id] = center
# 更新字典, 删除未使用的ID
self.center_points = new_center_points.copy()
return objects_bbs_ids
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐


所有评论(0)