ultralytics库中的YOLOv8模型和速度估计模块speed_estimation,结合OpenCV库,可以轻松实现车速检测。
speed_estimation模块实现速度计算的基本原理如下:
SpeedEstimator函数通过存储随时间推移的跟踪位置来处理帧,因此通过比较当前位置与定义区域内的先前位置来计算每个检测到的物体的速度,从而可以通过物体在该区域内移动所需的时间来估算物体的速度,这遵循了物理学中一个非常著名的术语:
v = Δs/Δt 其中,v为速度,Δs为位移(距离),Δt为时间间隔。
实现效果:

源码如下:
from ultralytics import YOLO
from ultralytics.solutions import speed_estimation
import cv2
#加载模型
model = YOLO(r'./model/predict/yolov8n.pt')
names = model.names
cap = cv2.VideoCapture(r"./video/test_track.mp4")
assert cap.isOpened(), "Error reading video file"
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
video_writer = cv2.VideoWriter("speed_result.mp4",
cv2.VideoWriter_fourcc(*'H264'),
fps,
(w, h))
#画出检测速度的水平线
line_pts = [(0, 300), (1280, 300)]
speed_obj = speed_estimation.SpeedEstimator(reg_pts=line_pts,
names=names,
view_img=True)
'''
speed_obj.set_args(reg_pts=line_pts,
names=names,
view_img=True)
'''
while cap.isOpened():
success, im0 = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
tracks = model.track(im0, persist=True, show=False)
im0 = speed_obj.estimate_speed(im0, tracks)
video_writer.write(im0)
cap.release()
video_writer.release()
cv2.destroyAllWindows()
这段代码的主要功能是使用YOLOv8模型对视频中的对象进行跟踪,并估计它们通过特定线段的速度。但是该方法受硬件检测速度等影响,计算出的速度不是特别准确。如果需要准确的计算车速,最好结合实际场景给出距离参考对象,这样计算出的速度才会更加准确。