Python for循环加if过滤连续重复值 实现OpenCV视频车辆计数
车辆计数去重逻辑修改方案
核心逻辑说明
你需要的是检测有效连通块数量的上升沿变化:仅当检测区域从无车(连通块数量为0)变为有车(连通块数量≥1)时计数+1,车辆持续在检测区域内的多帧重复检测不计数,刚好匹配你提到的「仅保留和前序值不同的变化值」需求。
具体修改点
- 新增全局变量
prev_blob,初始值为0,用于存储上一帧的有效连通块数量 - 移除for循环内部错误的计数逻辑,for循环仅负责统计当前帧的有效连通块总数
- 统计完当前帧连通块数量后增加判断:仅当
当前帧连通块数≥1 且 上一帧连通块数=0时,累加总计数 - 每次判断完成后,将当前帧连通块数赋值给
prev_blob供下一帧对比
修改后完整代码
from __future__ import print_function import cv2 as cv backSub = cv.createBackgroundSubtractorMOG2() backSub.setVarThreshold(150) capture = cv.VideoCapture('vtest.avi') total_vehicle = 0 # 新增:存储上一帧的有效blob数量 prev_blob = 0 while True: ret, frame = capture.read() crop = frame[300:, 260:360] if frame is None: break fgMask = backSub.apply(crop) #erode-dilate erode_img = cv.erode(fgMask, cv.getStructuringElement(cv.MORPH_ELLIPSE, (5,3)),iterations=2) dilate_img = cv.dilate(erode_img,cv.getStructuringElement(cv.MORPH_ELLIPSE, (10,3)),iterations=6) #contour con = cv.findContours(dilate_img, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)[-2] color = cv.cvtColor(dilate_img, cv.COLOR_GRAY2BGR) image = cv.drawContours(crop, con, -1, (0,255,0),2) output = cv.connectedComponentsWithStats(dilate_img, 8, cv.CV_32S) (nolabel, label, stats, centroid) = output current_blob = 0 for i in range(0, nolabel): if stats[i,cv.CC_STAT_AREA] > 10: current_blob += 1 # 新增:仅当从无车变为有车时计数 if current_blob >= 1 and prev_blob == 0: total_vehicle += 1 # 更新上一帧的blob值 prev_blob = current_blob print(total_vehicle) cv.imshow('Frame', frame) cv.imshow('dilate', dilate_img) keyboard = cv.waitKey(30) if keyboard == 'q' or keyboard == 27: break
内容的提问来源于stack exchange,提问作者artpdb
相关产品推荐
相关产品推荐

