OpenCV CV2 中 MOG、MOG2 和 GMG 之间的区别?

问题描述 投票:0回答:1

OPenCV 中的 3 种背景扣除方法:MOG、MOG2 和 GMG 有什么区别?

opencv image-processing difference background-subtraction
1个回答
28
投票

您可以参考此链接

为此目的引入了几种算法。 OpenCV已经实现了三种这样的算法,非常容易使用。我们将一一见到他们。

背景减法器MOG

它是一种基于高斯混合的背景/前景分割算法。它是在 2001 年 P. KadewTraKuPong 和 R. Bowden 的论文“An Improved Adaptive Backy Mix Model for Real-time Tracking with ShadowDetection”中介绍的。它使用了一种通过 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 年的“Improved Adaptive Gausian Mixed Model for Background Subtraction”和 2006 年的“Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction”。该算法的一个重要特点是:它为每个像素选择适当数量的高斯分布。 (请记住,在最后一个例子中,我们在整个算法中采用了 K 个高斯分布)。由于光照变化等原因,它可以更好地适应不同的场景。

与前面的情况一样,我们必须创建一个背景减法器对象。在这里,您可以选择是否检测阴影。如果 detectorShadows = 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()

(结果在最后给出)

背景减法器GMG

该算法结合了统计背景图像估计和每像素贝叶斯分割。它由 Andrew B. Godbehere、Akihiro Matsukawa、Ken Goldberg 在 2012 年的论文“响应式音频艺术装置的可变照明条件下对人类访客进行视觉跟踪”中介绍。根据论文,该系统成功运行了交互式音频名为“我们到了吗?”的艺术装置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 中,GMGMOG 可通过 bgsegm 子模块中的

contrib
(opencv-contrib-python==3.4.2.16) 使用:

cv2.bgsegm.createBackgroundSubtractorGMG()
cv2.bgsegm.createBackgroundSubtractorMOG()
© www.soinside.com 2019 - 2024. All rights reserved.