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
相关产品推荐
相关产品推荐

