如何在背景减法中计算前景区域的像素数

Posted

技术标签:

【中文标题】如何在背景减法中计算前景区域的像素数【英文标题】:How to calculate pixel number of foreground area in background subtraction 【发布时间】:2021-12-21 04:57:29 【问题描述】:

我使用背景减法技术创建了一个分割。下一步我要做的是消除像素数example frame

【问题讨论】:

OpenCV 有一个 findContours 和一个 connectedComonents 函数(它们中的任何一个)都可以为您提供不同“区域”的列表。在提取区域之前,您可能希望使用扩张和侵蚀来改善您的面具(例如,将头部与身体连接起来),但要找到好的参数可能具有挑战性。对于每个区域,您可以使用 contourArea 函数或计算非黑色像素。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

您可以使用findContourscontourArea。像这样的:

import cv2 as cv
import numpy as np

# change 0 to 1 for shadow detection
backSub = cv.createBackgroundSubtractorMOG2(500,16,0)

capture = cv.VideoCapture("path/to/video.mp4")
if not capture.isOpened():
    print('Unable to open video')
    exit(0)

while True:
    ret, frame = capture.read()
    if frame is None:
        break
    
    fgMask = backSub.apply(frame)
    
    cv.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)

    # this part is what you are looking for:
    contours, hierarchy = cv.findContours(fgMask, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
    
    # create an empty mask
    mask = np.zeros(frame.shape[:2],dtype=np.uint8)

    # loop through the contours
    for i,cnt in enumerate(contours):
        # if the size of the contour is greater than a threshold
        if  cv.contourArea(cnt) > 20:
            cv.drawContours(mask,[cnt], 0, (255), -1)
    
    cv.imshow('Frame', frame)
    cv.imshow('FG Mask', fgMask)
    cv.imshow("Mask", mask)
    
    keyboard = cv.waitKey(30)
    if keyboard == 'q' or keyboard == 27:
        break

【讨论】:

以上是关于如何在背景减法中计算前景区域的像素数的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV C++ 手势识别

如何使用背景减法在 OpenCV 中实现tripwire

如何使openCV背景减法KNN算法持续更长时间,跟踪一个没有移动的前景对象

Matlab - 运动检测的背景减法

学会注意错误

使用卡尔曼滤波器进行背景减法和前景检测