返回

如何使用 YOLOv8 构建车辆计数器?

python

引言

车辆计数器在交通管理、城市规划和安全方面有着广泛的应用。本文将指导您使用流行的 YOLOv8 对象检测模型构建一个车辆计数器。该计数器将检测和计数穿过虚拟线的车辆,并为检测到的车辆绘制边框。

构建车辆计数器

步骤 1:导入必要的库

import cv2
from ultralytics import YOLO

步骤 2:加载 YOLOv8 模型

model = YOLO('yolov8n.pt')

步骤 3:初始化视频捕获

cap = cv2.VideoCapture(video_path)

步骤 4:获取视频帧率

frame_rate = cap.get(cv2.CAP_PROP_FPS)

步骤 5:初始化车辆计数器

crossed_count = 0

步骤 6:定义虚拟线

virtual_line_y = 550

步骤 7:定义线范围

line_range = 5

步骤 8:处理视频帧

while True:
    ret, frame = cap.read()
    if not ret:
        break

步骤 9:绘制虚拟线

cv2.line(frame, (0, virtual_line_y), (frame.shape[1], virtual_line_y), (0, 0, 255), 2)

步骤 10:执行对象检测

detections = model(frame)

步骤 11:遍历检测结果

for det in detections:
    for box in det.boxes:

步骤 12:获取边界框坐标

bbox = box.xyxy.int().flatten().tolist()

步骤 13:绘制边界框

cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2)

步骤 14:显示对象位置

cv2.putText(frame, f'Position: {position}', (bbox[0], bbox[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

步骤 15:检查对象是否穿过虚拟线

if virtual_line_y - line_range <= bbox[1] <= virtual_line_y + line_range:
    crossed_count += 1

步骤 16:显示计数

cv2.putText(frame, f'Crossed Count: {crossed_count}', (int(frame.shape[1]/2) - 100, int(frame.shape[0]/2)),
            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)

步骤 17:显示已处理的帧

cv2.imshow('Frame', frame)

步骤 18:退出循环

if cv2.waitKey(10) & 0xFF == ord('q'):
    break

步骤 19:释放资源

cap.release()
cv2.destroyAllWindows()

改进

  • 使用实时摄像头捕捉视频流。
  • 实现更复杂的跟踪算法以准确识别每个车辆。
  • 添加额外的功能,例如速度测量或车辆分类。

常见问题解答

  1. 如何调整虚拟线的范围?

    修改 line_range 变量的值。较高的值会增加检测线周围的范围。

  2. 如何提高检测准确率?

    使用经过更高质量数据集训练的更准确的 YOLOv8 模型。

  3. 如何处理背景中的噪音?

    调整 YOLOv8 模型的阈值或考虑使用背景减除技术。

  4. 如何处理不同的照明条件?

    使用 YOLOv8 模型进行图像增强,例如颜色转换或对比度调整。

  5. 如何部署车辆计数器?

    将代码部署到边缘设备,例如 NVIDIA Jetson 或 Raspberry Pi。