如何用cv2与Ultralytics YOLO26模型实现多跨线车辆计数
解决多跨线车辆计数失效及画面闪烁问题
问题出在你创建了四个独立的ObjectCounter实例,每个实例都对同一帧图像进行处理,并且都开启了show=True。这会导致两个核心问题:
- 每个实例都维护自己的目标跟踪器,重复处理同一帧会引发跟踪ID冲突,后续实例无法正确识别和计数车辆;
- 多个实例反复修改并显示画面,造成视觉上的闪烁效果。
正确实现方式:单实例多区域计数
Ultralytics的ObjectCounter支持传入多个区域(region参数接受列表形式),只用一个实例就能同时处理所有跨线计数,避免跟踪冲突和画面闪烁。
修改后的代码如下:
from ultralytics import solutions, YOLO import cv2 model = YOLO("yolo26n.pt") cap = cv2.VideoCapture("intersection.mp4") assert cap.isOpened(), "Error reading video file" # 定义所有四条跨线,放入列表中 cross_lines = [ [(200, 275), (625, 250)], [(150, 325), (175, 475)], [(700, 275), (910, 400)], [(375, 500), (910, 450)] ] # 视频写入配置 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("car_counting_output.avi", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h)) # 初始化单个ObjectCounter实例,传入所有跨线区域 counter = solutions.ObjectCounter( region=cross_lines, # 这里传入多区域列表 show=True, show_conf=False, line_width=5, classes=[2, 7], model="yolo26n.pt" ) # 处理视频帧 while cap.isOpened(): success, im0 = cap.read() if not success: print("Video frame is empty or processing is complete.") break # 只用单个实例处理帧 results = counter(im0) # 将处理后的帧写入输出视频(原代码遗漏了这一步) video_writer.write(results) # 释放资源 cap.release() video_writer.release() cv2.destroyAllWindows()
额外注意事项
- 确保每条跨线的两个端点顺序符合车辆通行方向,
ObjectCounter会根据线段方向判断车辆进出; - 原代码遗漏了将处理后的帧写入输出视频的步骤,修改后的代码补充了
video_writer.write(results); - 处理完视频后记得释放捕获和写入资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Chloe
相关产品推荐
相关产品推荐

