代码之家  ›  专栏  ›  技术社区  ›  YQ.Wang

如何在已有背景图像的情况下获取前景掩码

  •  0
  • YQ.Wang  · 技术社区  · 8 年前

    cv2.createBackgroundSubtractorMOG2() 我们可以使用基于每500帧(默认)的背景估计方法减去前景掩码。但是呢 我已经有背景图片了 只需要在每一帧中使用该图片减去前景?我想说的是:

    import numpy as np
    import cv2
    
    video = "xx.avi"
    cap = cv2.VideoCapture(video)
    bg = cv2.imread("bg.png")
    
    while True:
        ret, frame = cap.read()
        original_frame = frame.copy()
        if ret:
            # get foremask?
            fgmask = frame - bg
    
            # filter kernel for denoising:
            kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    
            opening = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
    
            closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
    
            # Dilate to merge adjacent blobs
            dilation = cv2.dilate(closing, kernel, iterations = 2)
    
            # show fg:dilation
            cv2.imshow('fg mask', dilation)
            cv2.imshow('original', original_frame)
            k = cv2.waitKey(30) & 0xff
            if k == 27:
                cap.release()
                cv2.destroyAllWindows()
                break
        else:
            break
    

    但是我得到了 五颜六色的 frame = frame - bg

    1 回复  |  直到 8 年前
        1
  •  1
  •   iriusf    8 年前

    你得到的是彩色图像,因为你要减去2幅彩色图像,所以你在每个像素上得到的颜色是两幅图像之间每个通道(B、G和R)上的差异。 如dhanushka所言,为了执行背景减法,最简单的选择是使用MOG2并将其转发给背景图像约(500)帧,以便它将其作为背景学习。MOG2设计用于使用高斯模型学习每个像素颜色的可变性,因此如果您始终输入相同的图像,它将不会学习这一点。不管怎样,我认为它应该适合你打算做的事情。 这种方法的优点是,MOG2将处理更多的事情,如随着时间的推移更新模型、处理阴影等。

    所以,如果你想测试它,你需要把你的fgmask彩色图像转换成一些你可以很容易的阈值,并决定每个像素是背景还是前景。一个简单的选择是将其转换为灰度,然后应用一个简单阈值,阈值越低,减法越“敏感”(使用阈值),即:

    ...
    # get foremask?
        fgmask = frame - bg
    
        gray_image = cv2.cvtColor(fgmask, cv2.COLOR_BGR2GRAY)
        thresh = 20
        im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
    
        # filter kernel for denoising:
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    
        opening = cv2.morphologyEx(im_bw, cv2.MORPH_OPEN, kernel)
    ...