博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅
2、大数据、计算机专业选题(Python/Java/大数据/深度学习/机器学习)(建议收藏)✅
1、项目介绍
- 技术栈:PySide6、OpenCV和YOLOv8实时车速检测+车辆检测跟踪
- 这个项目的研究背景:当前交通监控场景中,传统车速检测与车辆跟踪多依赖人工或单一设备,存在实时性差、检测精度低、区域灵活性不足的问题。人工监控难以应对高频车流的实时数据记录,传统设备固定检测区域无法灵活适配不同路段,且易受环境干扰导致数据偏差,这些痛点制约了交通管控的效率与精准度,无法满足智慧交通对实时、灵活、准确检测的需求。
- 这个项目的研究意义:技术层面,通过YOLOv8实现高精度车辆检测,结合OpenCV完成视频处理与区域划定,依托PySide6提供可视化操作支撑,解决传统检测的技术局限;用户层面,支持自定义替换检测视频与调整检测区域,满足不同场景下的检测需求,提升使用灵活性;行业层面,为交通监控、道路管控等领域提供低成本、高适配性的实时检测方案,助力智慧交通场景的落地,具备实际应用价值。
2、项目界面
(1)车速检测车辆检测跟踪1
(2)车速检测车辆检测跟踪2
(3)车速检测车辆检测跟踪3
3、项目说明
本项目是基于Python 3.8环境开发的实时车速检测与车辆跟踪系统,整合PySide6、OpenCV与YOLOv8技术,核心实现车辆检测、跟踪及车速计算功能,旨在解决传统交通检测场景中灵活性不足、适配性低的问题。项目启动方式简单,用户仅需运行test.py文件即可开启功能,无需复杂配置。在视频源选择上,系统支持自定义替换检测视频,具体可修改test.py第22行代码"cap = cv2.VideoCapture('Vid1.mp4')",将括号内的视频文件名替换为目标视频路径,即可实现对不同场景视频的检测。检测区域设置同样具备高灵活性,在test.py第31行定义了初始检测区域"area = [(225, 335), (803, 335), (962, 408), (57, 408)]",该区域通过多边形顶点坐标列表表示,用户可根据实际需求调整坐标点数量与数值:若需矩形区域,可按"[(x1, y1), (x2, y1), (x2, y2), (x1, y2)]"的格式定义四个顶点;若需不规则区域,可增加坐标点并按顺时针或逆时针顺序排列,系统会通过cv2.polylines()函数将定义的检测区域绘制在视频帧上,当检测到车辆进入该区域时,自动触发后续的车速计算与跟踪处理。在核心技术逻辑上,YOLOv8算法负责对视频帧中的车辆进行高精度检测,获取车辆位置与轮廓信息;OpenCV负责视频读取、帧处理及检测区域绘制,同时结合车辆在检测区域内的运动轨迹计算车速;PySide6则为系统提供可视化界面支撑,确保检测结果与操作界面的直观呈现。整体而言,系统兼顾易用性与灵活性,既适用于交通监控相关的学习与研究场景,也可作为基础框架拓展至更多车辆检测相关的实际应用中,具备较强的实用性与可扩展性。
4、核心代码
python
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
# 检查速度是否超过速度限制
# if a_speed_kh >= speed_limit:
# # Display a warning message
# cv2.putText(frame, "Speed limit violated!", (440, 115),
# cv2.FONT_HERSHEY_TRIPLEX, 0.8, (255, 0, 255), 2, cv2.LINE_AA)
# # Display the message for 3 seconds
# start_time = time.time()
# while time.time() - start_time < 3:
# cv2.imshow("RGB", frame)
# if cv2.waitKey(1) & 0xFF == 27:
# break
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、源码获取方式
🍅**由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。**🍅
点赞、收藏、关注,不迷路,下方查看 👇🏻获取联系方式👇🏻