OpenCV 'BackgroundSubtractorMOG2' для двух изображений - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь выделить различия между двумя почти одинаковыми масками изображений, используя метод OpenSV 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'.enter image description here

Любые предложения.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Попробуйте и посмотрите, как это работает:

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()
0 голосов
/ 09 декабря 2018

Как указано в комментариях, вы должны побитовые операции.Это проще и намного эффективнее.Вы можете прочитать об этом здесь

Чтобы добавить дополнительную информацию: фоновый вычитатель можно (с некоторыми хитростями) использовать для неподвижных изображений, но он предназначен для видео.Вы можете найти пример кода здесь

Что касается вашего кода, он не устанавливает сплошной фон, поскольку он чередует два исходных изображения в каждом кадре.Поэтому результатом является пустая маска.

...