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

OpenCV车辆检测单帧计数文字重叠问题求解

问题根因

原代码出现数字重叠是两个逻辑位置错误导致的:

  • cv2.putText被放在了遍历车辆检测框的for循环内部,每检测到1辆车就会在同一坐标位置绘制一次数字,同位置依次叠画0、1、2……最终出现数字重叠发虚的效果
  • cv2_imshow同样放在循环内部,每绘制一个检测框就刷新一次画面,不是整帧处理完成后统一展示,会加剧显示异常
  • 循环内维护cnt变量累加计数的逻辑没有必要,detectMultiScale返回的cars是当前帧所有检测到的车辆坐标数组,直接取数组长度即可得到准确的单帧车辆总数。
修复方案
  • 将计数文字绘制、画面展示的逻辑移到检测框遍历循环外部,等所有车辆矩形框绘制完成后,在固定位置仅绘制一次当前帧总计数
  • 直接使用len(cars)获取单帧车辆总数,替代循环内累加计数的逻辑,避免计数错误
  • 调整文字绘制的字号、坐标,适配最终输出的视频分辨率,避免文字超出画面边界
修正后可直接运行的代码
import cv2

cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))  

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

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cars = car_cascade.detectMultiScale(gray, 1.1, 2)
    
    # 循环内只绘制车辆检测框,不处理计数和文字
    for (x,y,w,h) in cars:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,255), 2)

    # 统一计算单帧总车辆数,绘制一次计数文字
    car_count = len(cars)
    cv2.putText(
        img,
        f"Vehicles in frame: {car_count}",
        (10, 40),
        cv2.FONT_HERSHEY_SIMPLEX,
        0.8,
        (0, 255, 0),
        2,
        cv2.LINE_AA
    )

    # 调整尺寸后写入视频、展示画面
    img = cv2.resize(img, (450,250))
    video.write(img)
    # 本地OpenCV环境用cv2.imshow,Colab环境替换为原cv2_imshow即可
    cv2.imshow("Detection Result", img)
    # 按q键可提前终止检测
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video.release()
cap.release()
cv2.destroyAllWindows()
补充说明
  • 上述单帧计数逻辑是准确的,统计结果对应当前帧下Haar Cascade模型输出的所有检测目标数量。如果实际场景中出现计数和肉眼观测不符,是Haar Cascade本身的误检、漏检问题,可更换为YOLO系列等精度更高的检测模型优化效果
  • 如果需要统计整个视频段内的累计车辆总数(而非单帧瞬时计数),需要额外接入目标跟踪算法,给每个检测到的车辆分配唯一ID,避免同一辆车在多帧出现被重复计数

内容的提问来源于stack exchange,提问作者falkon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:48:36