OpenCV 'BackgroundSubtractorMOG2' 两张图片
OpenCV 'BackgroundSubtractorMOG2' for two images
我正在尝试使用 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'。
任何建议。 ?
如评论中所述,您应该按位运算。它更容易,效率更高。你可以阅读它 here
要添加一些额外的信息:背景减法器可以(有一些技巧)用于静止图像,但它适用于视频。您可以找到示例代码 here
至于你的代码,它没有建立一个坚实的背景,因为它在每一帧上交替使用两个源图像。因此结果是一个空白掩码。
试一试,看看效果如何:
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()
我正在尝试使用 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'。
任何建议。 ?
如评论中所述,您应该按位运算。它更容易,效率更高。你可以阅读它 here
要添加一些额外的信息:背景减法器可以(有一些技巧)用于静止图像,但它适用于视频。您可以找到示例代码 here
至于你的代码,它没有建立一个坚实的背景,因为它在每一帧上交替使用两个源图像。因此结果是一个空白掩码。
试一试,看看效果如何:
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()