Zak*_*rya 12
您可以参考以下链接:http:
//docs.opencv.org/master/db/d5c/tutorial_py_bg_subtraction.html#gsc.tab=0
为此目的引入了几种算法.OpenCV已经实现了三种非常容易使用的算法.我们将逐一看到它们.
BackgroundSubtractorMOG
它是基于高斯混合的背景/前景分割算法.它是在P. KadewTraKuPong和R. Bowden于2001年发表的论文"用于阴影检测的实时跟踪的改进的自适应背景混合模型"中引入的.它使用一种方法通过K个高斯分布的混合来模拟每个背景像素( K = 3至5).混合物的重量表示这些颜色在场景中停留的时间比例.可能的背景颜色是保持更长和更静态的颜色.
在编码时,我们需要使用函数cv2.createBackgroundSubtractorMOG()创建一个后台对象.它有一些可选参数,如历史长度,高斯混合数,阈值等.它们都设置为某些默认值.然后在视频循环中,使用backgroundsubtractor.apply()方法获取前景蒙版.
看一个简单的例子如下:
Run Code Online (Sandbox Code Playgroud)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()(所有结果都显示在最后以供比较).
BackgroundSubtractorMOG2
它也是基于高斯混合的背景/前景分割算法.它基于Z.Zivkovic的两篇论文,"改进的自适应Gausian混合模型用于背景减法",2004年和"高效自适应密度估计每个图像像素用于背景减法任务",2006年.该算法的一个重要特征是它为每个像素选择适当数量的高斯分布.(请记住,在最后一种情况下,我们在整个算法中采用了K高斯分布).由于照明变化等原因,它可以更好地适应不同的场景.
与前面的情况一样,我们必须创建一个背景减法器对象.在这里,您可以选择是否检测阴影.如果detectShadows = True(默认情况下是这样),它会检测并标记阴影,但会降低速度.阴影将以灰色标记.
Run Code Online (Sandbox Code Playgroud)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()(最后给出的结果)
BackgroundSubtractorGMG
该算法结合了统计背景图像估计和每像素贝叶斯分割.它由Andrew B. Godbehere,Akihiro Matsukawa,Ken Goldberg于2012年在他们的论文"可变照明条件下的人类访问者视觉跟踪以响应音频艺术安装"中介绍.根据该论文,该系统运行成功的交互式音频2011年3月31日至7月31日在加利福尼亚州旧金山的当代犹太博物馆举办的名为"我们在那里吗?"的艺术装置.
它使用前几个(默认为120个)帧进行背景建模.它采用概率前景分割算法,使用贝叶斯推断识别可能的前景对象.估计是适应性的; 较新的观测值比旧的观测值更重,以适应可变照明.进行了几种形态滤波操作,如关闭和打开,以消除不必要的噪音.在前几帧中你会得到一个黑色的窗口.
最好将形态开口应用于结果以消除噪音.
Run Code Online (Sandbox Code Playgroud)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()