详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG

cv::bgsegm::BackgroundSubtractorMOG是基于高斯混合模型的背景与前景分割算法。

具体的算法原理可以参考下面这篇论文:
Pakorn KaewTraKulPong and Richard Bowden. An improved adaptive background mixture model for real-time tracking with shadow detection. In Video-Based Surveillance Systems, pages 135–144. Springer, 2002.
下面这篇博文是对上面这篇论文的理解:
https://blog.csdn.net/zinnc/article/details/52090501

MOG名称的来历:Mixture of Gaussian,它又称为GMM(Gaussian Mixed Model),百度百科对其有详细解释,链接 https://baike.baidu.com/item/GMM/4258031?fr=aladdin

GMM,高斯混合模型,也可以简写为MOG。高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
GMMs已经在数值逼近、语音识别、图像分类、图像去噪、图像重构、故障诊断、视频分析、邮件过滤、密度估计、目标识别与跟踪等领域取得了良好的效果 。

混合高斯模型使用K(基本为3到5个)个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型, 用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。 通观整个高斯模型,主要是有方差和均值两个参数决定,对均值和方差的学习,采取不同的学习机制,将直接影响到模型的稳定性、精确性和收敛性 。
由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学习能力,改进方法对均值和方差的更新采用不同的学习率;为提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立背景图像并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。
高斯分布的形状同绝大多数数据的分布形状相似,能够很好地刻画参数空间中数据的空间分布及其特性,而且高斯密度函数具有易于进行参数估计等优点,因此高斯混合模型广泛应用于模式识别和数据分析等领域 [2] 。

下面介绍其成员函数。

继承于基类cv::BackgroundSubtractor的成员函数apply()和getBackgroundImage()的详细介绍见博文:https://blog.csdn.net/wenhao_ir/article/details/125007017

其特有的成员函数如下:

 virtual double cv::bgsegm::BackgroundSubtractorMOG::getBackgroundRatio( )	const

成员函数getBackgroundRatio()用于返回算法的“背景比率”参数,它对应于论文中的TB参数。如果前景像素在大约【backgroundRatio×历史帧(即参数nframes)】中保持半常量值,则将其视为背景并作为新组件的中心添加到背景模型中。提问:什么叫半常量值(semi-constant value),这个博主也不太清楚,这个算法的论文中应该有相关介绍,感兴趣的同学可以去看一看。

virtual int cv::bgsegm::BackgroundSubtractorMOG::getHistory() const

成员函数getHistory()用于返回影响背景模型的历史帧数。

virtual int cv::bgsegm::BackgroundSubtractorMOG::getNMixtures( ) const

成员函数getNMixtures()用于返回高斯混合模型中高斯分量的个数。

virtual double cv::bgsegm::BackgroundSubtractorMOG::getNoiseSigma( ) const

成员函数getNoiseSigma()用于返回每个高斯分量的初始方差。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setBackgroundRatio(double backgroundRatio)	

成员函数setBackgroundRatio用于设置算法的“背景比率”参数,这个参数的意义在上面已经介绍了。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setHistory(int nframes)	

成员函数setHistory()用于设置影响背景模型的历史帧数。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setNMixtures(int 	nmix)	

成员函数setNMixtures()用于设置高斯混合模型中高斯分量的个数。

virtual void cv::bgsegm::BackgroundSubtractorMOG::setNoiseSigma	(double noiseSigma)

成员函数setNoiseSigma()用于设置每个高斯分量的初始方差。

下面上示例代码:

上示例代码被迫中止,原因是OpenCV3的开发文档中虽然还有这个类,但是在OpneCV3官方发布的编译好的配置环境下却不能使用了,截图如下:
详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG
我们换成BackgroundSubtractorMOG2,就有定义,截图如下:
详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG
可能的解决方法是自己Cmake OpenCV3的源码,并且在编译时把模块bgsegm加入。这里博主就不去尝试了,如果要使用这个算法进行背景建模/前景提取,用BackgroundSubtractorMOG2替代就行了。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年5月30日 上午10:42
下一篇 2022年5月30日

相关推荐