详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG
Posted 昊虹图像算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解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官方发布的编译好的配置环境下却不能使用了,截图如下:
我们换成BackgroundSubtractorMOG2,就有定义,截图如下:
可能的解决方法是自己Cmake OpenCV3的源码,并且在编译时把模块bgsegm加入。这里博主就不去尝试了,如果要使用这个算法进行背景建模/前景提取,用BackgroundSubtractorMOG2替代就行了。
以上是关于详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG的主要内容,如果未能解决你的问题,请参考以下文章
详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::BackgroundSubtractorKNN,并利用它实现对道路监控视频前景/背景的提取
详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGMG,并利用它实现对道路监控视频前景的提取
OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理和特点是什么。
OpenCV3中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理和特点是什么。
OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorLSBP的使用示例代码及运行效果
OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGSOC的使用示例代码及运行效果