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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:45:01