You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:17:33