Python OpenCV';背景2';两张图片

Python OpenCV';背景2';两张图片,python,image,opencv,image-processing,background-subtraction,Python,Image,Opencv,Image Processing,Background Subtraction,我试图使用OpenCV的BackgroundSubtractorMOG2方法突出两个几乎相似的图像遮罩之间的差异 我的代码: def Approach_2(): img = [0, 0] img[0] = cv2.imread('images/4-left.PNG', cv2.IMREAD_GRAYSCALE) img[1] = cv2.imread('images/4-right.PNG', cv2.IMREAD_GRAYSCALE) img[0], img[

我试图使用OpenCV的BackgroundSubtractorMOG2方法突出两个几乎相似的图像遮罩之间的差异

我的代码:

def Approach_2():
    img = [0, 0]
    img[0] = cv2.imread('images/4-left.PNG', cv2.IMREAD_GRAYSCALE)
    img[1] = cv2.imread('images/4-right.PNG', cv2.IMREAD_GRAYSCALE)

    img[0], img[1] = make_similar(img[0], img[1]) # make two images similar (equal width and height) by applying scaling, translation and performs Canny edge detection on two images

    fps = 5

    fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=True)

    cv2.imshow("A", img[0])
    cv2.imshow("B", img[1])

    i = 1
    while(True):

        frame = img[i]
        i = 1-i
        fgmask = fgbg.apply(frame)        

        cv2.imshow('original', frame)
        cv2.imshow('fg', fgmask)
        # cv2.imshow('fg', cv2.bitwise_and(frame, frame, mask=fgmask))

        time.sleep(1 / fps)

        if(cv2.waitKey(1) & 0xFF == ord('q')) : break

    cv2.destroyAllWindows()

if __name__ == '__main__':
    Approach_2()
但我得到的只是空白的“fgmask”。


有什么建议吗

如注释中所述,您应该进行位运算。它更容易,效率也更高。你可以读到它

添加一些额外信息:背景减法器可以(通过一些技巧)用于静止图像,但它是用于视频的。您可以找到示例代码


至于您的代码,它不能建立一个坚实的背景,因为它在每一帧上交替显示两个源图像。因此,结果是一个空白掩码。

尝试一下,看看它是如何工作的:

while(True):

    f1 = img[0]
    f2 = img[1]
    fg1 = fgbg.apply(f1)
    fb2 = fgbg.apply(f2)

    cv2.imshow('original', frame)
    cv2.imshow('fg1', fg1)
    cv2.imshow('fg2', fb2)
    # cv2.imshow('fg', cv2.bitwise_and(frame, frame, mask=fgmask))

    time.sleep(1 / fps)

    if(cv2.waitKey(1) & 0xFF == ord('q')) : break

cv2.destroyAllWindows()

使用MOG背景减法器(带阴影检测)来找出两幅二值图像的差异,这不是有点过分了吗?IMHO a
bitwise_和
来获取相同的点,
bitwise_xor
来获取两者之间不同的点,等等。实际上,这两个图像没有太大的相似性(像素级)来对其应用逐位操作。