这三种背景扣除方法有什么区别?

最佳答案

您可以参考this link

为此引入了几种算法。 OpenCV已经实现了三种非常易于使用的算法。我们将一一看到它们。


背景分包商

它是基于高斯混合的背景/前景分割算法。它在2001年由P. KadewTraKuPong和R. Bowden在论文“用于阴影检测的实时跟踪的改进的自适应背景混合模型”中进行了介绍。它使用一种方法,通过混合K个高斯分布对每个背景像素进行建模( K = 3到5)。混合物的权重代表了这些颜色在场景中停留的时间比例。可能的背景颜色是保持更长且更静态的颜色。

在编码时,我们需要使用函数cv2.createBackgroundSubtractorMOG()创建一个背景对象。它具有一些可选参数,例如历史记录的长度,高斯混合的数量,阈值等。所有这些参数均设置为一些默认值。然后在视频循环内,使用backgroundsubtractor.apply()方法获取前景蒙版。

请参见下面的简单示例:

1 import numpy as np
2 import cv2
3
4 cap = cv2.VideoCapture('vtest.avi')
5
6 fgbg = cv2.createBackgroundSubtractorMOG()
7
8 while(1):
9     ret, frame = cap.read()
10
 11     fgmask = fgbg.apply(frame)
 12
 13     cv2.imshow('frame',fgmask)
 14     k = cv2.waitKey(30) & 0xff
 15     if k == 27:
16         break
17
18 cap.release()
19 cv2.destroyAllWindows()


(所有结果显示在末尾以进行比较)。

背景减法器MOG2

它也是基于高斯混合的背景/前景分割算法。它基于Z.Zivkovic的两篇论文,分别是2004年的“改进的用于背景相减的自适应高斯混合模型”和2006年的“用于背景相减任务的每个图像像素的高效自适应密度估计”。该算法的一个重要特点是它为每个像素选择适当数量的高斯分布。 (请记住,在最后一种情况下,我们在整个算法中采用了K高斯分布)。由于光照变化等原因,它对变化的场景具有更好的适应性。

与前面的情况一样,我们必须创建一个背景减法器对象。在这里,您可以选择是否检测阴影。如果detectShadows = True(默认情况下为True),它将检测并标记阴影,但会降低速度。阴影将标记为灰色。

1 import numpy as np
2 import cv2
3
4 cap = cv2.VideoCapture('vtest.avi')
5
6 fgbg = cv2.createBackgroundSubtractorMOG2()
7
8 while(1):
9     ret, frame = cap.read()
 10
 11     fgmask = fgbg.apply(frame)
12
13     cv2.imshow('frame',fgmask)
14     k = cv2.waitKey(30) & 0xff
15     if k == 27:
16         break
17
18 cap.release()
19 cv2.destroyAllWindows()


(结果在最后给出)

背景减法器

该算法结合了统计背景图像估计和按像素的贝叶斯分割。它是在2012年由Andrew B. Godbehere,Akihiro Matsukawa,Ken Goldberg在其论文“在可变照明条件下对观众的视觉跟踪以进行响应式音频艺术装置”中介绍的。根据该论文,该系统成功运行了交互式音频艺术品装置“我们还在那里吗?”从2011年3月31日至7月31日在加利福尼亚州旧金山的当代犹太博物馆举行。

它使用前几帧(默认为120帧)进行背景建模。它采用概率前景分割算法,该算法使用贝叶斯推断来识别可能的前景对象。估计是自适应的;为了适应可变照明,较新的观测值比旧的观测值更重。完成了一些形态滤波操作,例如关闭和打开,以消除不需要的噪声。在最初的几帧中,您将得到一个黑色的窗口。

最好对结果应用形态学开放以消除噪声。

1 import numpy as np
2 import cv2
3
4 cap = cv2.VideoCapture('vtest.avi')
5
6 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
7 fgbg = cv2.createBackgroundSubtractorGMG()
8
9 while(1):
10     ret, frame = cap.read()
11
12     fgmask = fgbg.apply(frame)
13     fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
14
15     cv2.imshow('frame',fgmask)
16     k = cv2.waitKey(30) & 0xff
17     if k == 27:
18         break
19
20 cap.release()
21 cv2.destroyAllWindows()



在OpenCV的较新版本中,bgsegm子模块中的contrib(opencv-contrib-python==3.4.2.16)提供了GMG和MOG:

cv2.bgsegm.createBackgroundSubtractorGMG()
cv2.bgsegm.createBackgroundSubtractorMOG()

关于difference - MOG,MOG2和GMG之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33266239/

10-09 14:54