相关文章推荐
八块腹肌的眼镜  ·  Java ...·  8 月前    · 
害羞的帽子  ·  Page Class ...·  1 年前    · 
听话的伤痕  ·  群集数据库 - BizTalk ...·  1 年前    · 

在计算机视觉应用中,背景减除是一项至关重要的技术,它可以帮助我们从视频流中分离出动态的前景对象。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...