在计算机视觉应用中,背景减除是一项至关重要的技术,它可以帮助我们从视频流中分离出动态的前景对象。OpenCV库提供了多种背景减除的方法,其中
cv2.createBackgroundSubtractorMOG2
是一种非常有效的手段。
cv2.createBackgroundSubtractorMOG2
是OpenCV中用于创建背景减除器的一个函数,该方法基于混合高斯模型(GMM)和背景减除算法。MOG2代表“Mixture of Gaussian V2”,是OpenCV中用于背景/前景分割的算法之一。
1.工作原理
cv2.createBackgroundSubtractorMOG2
函数的工作原理主要基于混合高斯模型(GMM)。这种模型使用多个高斯分布来表征图像中每个像素点的颜色分布。以下是该函数工作原理的简要介绍:
模型初始化
在开始时,算法会对视频中的每个像素建立一个混合高斯模型。这个模型会学习并适应场景中的背景变化。
随着新帧的到来,算法会更新每个像素的高斯分布。对于与现有高斯分布匹配良好的像素,这些分布会被更新以反映最新的像素值。对于不匹配任何现有分布的像素,会创建新的高斯分布或替换最不可能代表背景的高斯分布。
如果某个像素的值与所有高斯分布都不匹配,或者只与表示前景的高斯分布匹配,则该像素被视为前景像素。通过这种方式,算法能够区分出动态的前景对象和静态的背景。
阴影检测
(如果启用)
算法还可以检测并标记出由于前景对象遮挡而产生的阴影区域。这有助于在后处理中区分真实的运动对象和由阴影造成的误检。
2.函数原型
在Python的OpenCV库中,该函数的原型如下:
cv2.createBackgroundSubtractorMOG2([, history[, varThreshold[, detectShadows]]])
-
history
:表示用于训练背景模型的时间长度,单位是帧数。它决定了背景模型更新的速度,值越大,背景模型更新的速度就越慢。默认值是200。
-
varThreshold
:用于判断像素是否为背景的阈值。这个参数对结果有很大影响,值越小,检测到的运动物体就越多,但也可能增加误检。默认值是15,但你可以根据具体的应用场景进行调整。
-
detectShadows
:一个布尔值,用于指示算法是否应该检测阴影并将其标记为前景。如果设置为True,检测到的阴影会被标记为特殊值(通常是127),这样你就可以在后处理阶段轻松识别并可能忽略它们。默认值是False。
3.代码示例
下面是一个简单的示例,展示了如何使用
cv2.createBackgroundSubtractorMOG2
函数:
import cv2
import numpy as np
# 打开视频文件或摄像头
cap = cv2.VideoCapture('test.avi')
# 创建背景减除器
fgbg = cv2.createBackgroundSubtractorMOG2(varThreshold=30, detectShadows=True)
while True:
# 读取一帧图像
ret, frame = cap.read()
if not ret:
break
# 应用背景减除器
fgmask = fgbg.apply(frame)
# 显示结果
cv2.imshow('cap', frame)
cv2.imshow('frame', fgmask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
在这个例子中,我们创建了一个
cv2.createBackgroundSubtractorMOG2
对象,并通过调整
varThreshold
和
detectShadows
参数来定制其行为。然后,我们读取视频的每一帧,将其传递给背景减除器,并显示结果。
4.调整参数
-
varThreshold=30
:这个值比默认值大,意味着算法对像素变化的容忍度更高。这会导致更少的运动被检测为前景,但也会减少误检的情况出现。
-
detectShadows=True
:启用阴影检测。这对于避免将阴影错误地识别为前景对象非常有用。
通过调整这些参数,可以优化背景减除的效果。例如,处理一个包含许多快速移动对象和复杂背景的场景,需要增加
varThreshold
的值来减少误检。相反,如果需要尽可能准确地检测出所有运动,需要减小这个值。
混合高斯分布(GMM)是
背景
建模
中
的经典算法,自提出至今已经有了很多围绕它改进和应用的论文。
opencv
中
(2.4.13版本)也引入了该算法及其改进版本。
首先是基本版本的GMM,
opencv
将其封装为
Background
Sub
trac
tor
MOG,有关该版本算法源码解读及相关论文翻译参考点击打开链接
之后是改进版GMM,
opencv
把它封装为
Background
Sub
trac
tor
MOG2
算法类,源代码位于
opencv
\sources\modules\video\src\bgfg_gaussmix2.
该方法可以用来做运动检测,用法:
Ptr<
Background
Sub
trac
tor
MOG2
> mog =
create
Background
Sub
trac
tor
MOG2
(100,25,false);
his
tor
y:用于训练
背景
的帧数,默认帧数为500帧,如果不动手设置learingRate,his
tor
y就被用于计算当前的learningRate, 此时his
tor
y越大,learningRate越小,
背景
更新越慢;
varThreshold:方差阈值,用于判断当前像素是前景还是
背景
。一般
cv::
Background
Sub
trac
tor
MOG2
和cv::bgsegm::
Background
Sub
trac
tor
MOG一样,都是基于高斯混合模型的
背景
与前景分割算法。
cv::
Background
Sub
trac
tor
MOG2
是对cv::bgsegm::
Background
Sub
trac
tor
MOG的改进,经过改进,它实现了自适应高斯混合模型参数的更新,增强了复杂场景
背景
检测的性能。
具体的算法原理可以参见下面两篇论文:
Zoran Zivkovic and Ferdinand van d
Opencv
集成了
Background
Sub
trac
tor
MOG2
用于动态目标检测,用到的是基于自适应混合高斯
背景
建模的
背景
减除
法,相对于
Background
Sub
trac
tor
MOG,其具有更好的抗干扰能力,特别是光照变化。
-------------------------------------------------------------------------------------
Background
Sub
trac
tor
MOG2
基于自适应混合高斯
背景
建模,具有一定的抗光照干扰的能力,参数配置如下
Ptr<
Background
Sub
trac
tor
MOG2
> bg
sub
trac
tor
=
create
Background
Sub
trac
tor
MOG2
();
// 用于训练
背景
的帧数,如果不手动设置learning rate,his
tor
y就被用于计算当前的learni...