OpenCV中高斯混合背景建模算法汇总
2019独角兽企业重金招聘Python工程师标准>>>
引用地址:http://blog.csdn.net/chuhang_zhqr/article/details/51060745
GMM是网上到处可见且用得最多的背景建模算法,论文上很多相关概率公式,又看了很多博客对于GMM的解释,直到现在还总是觉得很难理解其中的真谛,从各方面整理一下目前自己所理解的内容,如果有理解偏差,欢迎指正。
Mog2用的是自适应的高斯混合模型(Adaptive GMM,Gaussian Mixture Model),在OpenCV中开源了的几种背景提取算法MOG,MOG2,GMG的测试程序结果中,MOG2确实在前景连续性及运算时间上都脱颖而出,后面会给出比较结果。下面就结合OpenCV2.4.9的mog2源码和源码文档中指出的04年Zoran Zivkovic的三篇论文,简要串一串GMM的理论基础,MOG2的大致原理,在代码实现上的结构及MOG2 API的用法。
背景建模的思想由来
在监控系统中,拍摄背景通常是变化较少的固定场景。通常我们假定没有入侵物体的静态场景具有一些常规特性,可以用一个统计模型描述。GMM就是用高斯模型,而且是多个高斯模型的加权和混合在一起来模拟背景的特性。这样一旦已知这个背景模型,入侵物体就能通过标出场景图像中不符合这一背景模型的部分来检测到。这一过程被称为背景减除(Backgroundsubtraction),我猜OpenCV中各种背景建模方法的基类称作“BackgroundSubtractor”也源于此吧。
GMM模型参数估计的通常思路——GMM参数的EM估计
一旦背景以高斯混合模型来模拟了,现在确定这个模型变成了解出高斯混合模型公式中的一系列参数,在解参数时通常用的是EM演算法,EM演算法分两步:E-step和M-step。
关于EM算法的推导过程,链接的这个博客阐述的非常详细。
最大似然估计, EM算法理解上很有难度,涉及到最大似然估计上面链接也可以作为参考。
Mog2建模过程及各可调参数意义
上面说到GMM是用多个高斯模型的加权和来表示,假定是M个高斯分量,讨论M的取值是MOG2的作者研究的一个重点:在他之前Stauffer & Grimson取固定个数的高斯分量(M=4), Zoran则根据不同输入场景自动选择分量的个数。这样做的好处是在较简单的场景下,将只选出一个较重要的高斯分量,节省了后期更新背景时选属于哪一分量的时间,提高了速度。有两个测试结果为证:一是用OpenCV中测试程序对同一简单场景测试视频跑不同算法得到的运行时间如下表,明显mog2快很多;
mog | mog2 | gmg | |
电脑1 | 26904 | 14386 | 25533 |
电脑2 | 26947 | 14578 | 28834 |
二是Zoran在讲背景更新的论文[i]的三个测试视频结果(图1, 摘自[1]中Fig.1第1,2列), 图中Traffic场景作为一个较简单的场景,背景变化不大,第二行中纯黑背景表示背景只用一个高斯分量,速度13ms较固定四个分量的19ms快了很多,而测试的Trees场景背景中包含树影晃动,背景浅灰色部分表示有多个高斯分量在更新,在这种场景自适应方法并没有优势。
对于整个图像的每个像素点都建立了一个GMM模型,建模过程中运用EM算法来求解参数组,一旦模型建立,后面每新来一帧都可以根据是否符合已建立的北京模型判断FG/BG,并会按论文中的参数更新公式更新GMM的所有参数。
OpenCV代码实现结构梳理
OpenCV中,各背景建模方法类继承关系如下图,BackgroundSubtractor是基类。
也给出一个博客,OpenCV中MOG2的代码结构梳理。
在mog2的使用中,初始化后,operator()函数是执行背景更新的主要函数,operator()内部实现主要是OpenCV的一个并行框架parallel_for_(),再深入实际是MOG2Invoker类的operator()实现了背景更新的具体数学运算。具体实现可以查看MOG2Invoker API文档。
Mog2.operator()
Parallel_for_()
Invoker.operator()
MOG2 API用法(how to use)
Mog,mog2,gmg的整体框架都一样,用法也很简单,可以根据openCV官方的tutorial来看。
[i] Efficient adaptivedensity estimation per image pixel for the task of background subtraction.
原文:
http://blog.csdn.net/chuhang_zhqr/article/details/51060745
在很多基础应用中背景检出都是一个非常重要的步骤。例如顾客统计,使用一个静态摄像头来记录进入和离开房间的人数,或者是交通摄像头,需要提取交通工具的信息等。在所有的这些例子中,首先要将人或车单独提取出来。
技术上来说,我们需要从静止的背景中提取移动的前景。如果你有一张背景(仅有背景不含前景)图像,比如没有顾客的房间,没有交通工具的道路等,那就好办了。我们只需要在新的图像中减去背景就可以得到前景对象了。但是在大多数情况下,我们没有这样的(背景)图像,所以我们需要从我们有的图像中提取背景。如果图像中的交通工具还有影子的话,那这个工作就更难了,因为影子也在移动,仅仅使用减法会把影子也当成前景。真是一件很复杂的事情。
1:BackgroundSubtractorMOG
这是一个以混合高斯模型为基础的前景/背景分割算法。它是 P.KadewTraKuPong和 R.Bowden 在 2001 年提出的。它使用 K(K=3 或 5)个高斯分布混合对背景像素进行建模。使用这些颜色(在整个视频中)存在时间的长短作为混合的权重。背景的颜色一般持续的时间最长,而且更加静止。一个像素怎么会有分布呢?在 x,y 平面上一个像素就是一个像素没有分布,但是我们现在讲的背景建模是基于时间序列的,因此每一个像素点所在的位置在整个时间序列中就会有很多值,从而构成一个分布。
在编写代码时,我们需要使用函数: cv2.createBackgroundSubtractorMOG()创建一个背景对象。这个函数有些可选参数,比如要进行建模场景的时间长度,高斯混合成分的数量,阈值等。将他们全部设置为默认值。然后在整个视频中我们是需要使用 backgroundsubtractor.apply() 就可以得到前景的掩模了。
2:BackgroundSubtractorMOG2
这个也是以高斯混合模型为基础的背景/前景分割算法。它是以 2004 年和 2006 年 Z.Zivkovic 的两篇文章为基础的。这个算法的一个特点是它为每一个像素选择一个合适数目的高斯分布。(上一个方法中我们使用是 K 高斯分布)。这样就会对由于亮度等发生变化引起的场景变化产生更好的适应。
和前面一样我们需要创建一个背景对象。但在这里我们我们可以选择是否检测阴影。如果detectShadows = T rue(默认值),它就会检测并将影子标记出来,但是这样做会降低处理速度。影子会被标记为灰色。
3:BackgroundSubtractorGMG
此算法结合了静态背景图像估计和每个像素的贝叶斯分割。这是 2012年Andrew_B.Godbehere, Akihiro_Matsukawa 和 Ken_Goldberg 在文章中提出的。它使用前面很少的图像(默认为前 120 帧)进行背景建模。使用了概率前景估计算法(使用贝叶斯估计鉴定前景)。这是一种自适应的估计,新观察到的
对象比旧的对象具有更高的权重,从而对光照变化产生适应。一些形态学操作如开运算闭运算等被用来除去不需要的噪音。在前几帧图像中你会得到一个黑色窗口。
对结果进行形态学开运算对与去除噪声很有帮助。
BackgroundSubtractorMOG 的结果
BackgroundSubtractorMOG2 的结果
灰色区域代表阴影
BackgroundSubtractorGMG 的结果
使用形态学开运算将噪音去除。
转载于:https://my.oschina.net/u/3702502/blog/1798413
OpenCV中高斯混合背景建模算法汇总相关推荐
- 动目标检测算法——高斯混合背景建模
混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量.每个模式的均值和标准差)表示背景,然后使用统计差分(如3σ原则)进行目标像素判断, ...
- ViBe背景建模算法
ViBe算法:ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网: ...
- Python,OpenCV中的光学字符识别OCR文章汇总
Python,OpenCV中的光学字符识别OCR文章汇总 Python,OpenCV中的光学字符识别(OCR Optical Character Recognition) 使用Python,OpenC ...
- 混合高斯背景建模算法GMM
高斯混合模型介绍 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,该方法使用了高斯分布作为参数模型,并使用了**期望最大(Expectatio ...
- OpenCV中的混合高斯算法原理
申明:以下内容为笔者翻译自国际会议论文,鉴于本人水平有限,翻译难免有误,请大家多多包容. 原文为: An Improved Adaptive Background Mixture Model for ...
- Opencv实战之混合高斯前景背景分割算法
-不管三七二十一,先上代码 -读取需要掌握的函数 # 相关函数 # cv.VideoCapture() 初始化摄像头,0开启第一个摄像头,1开启第2个摄像头,返回摄像头对象,一般会自动打开摄像头 # ...
- OpenCV中的图像阈值处理算法
简 介: 本文讨论了如何通过图像阈值算法来对图像中特点对接进行隔离. 演示了几种不同的阈值分割(全局阈值分割)算法的结果.对于最简单的阈值算法,通过改变其中的阈值可以获得不同的分割效果. 关键词: 阈 ...
- opencv中使用K-近邻分类算法KNN
K-近邻(K-Nearest Neighbors, KNN)是一种很好理解的分类算法,简单说来就是从训练样本中找出K个与其最相近的样本,然后看这K个样本中哪个类别的样本多,则待判定的值(或说抽样)就属 ...
- 深入学习OpenCV中图像相似度的算法
最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...
最新文章
- MVC缓存OutPutCache学习笔记 (一) 参数配置
- Google和网易有道合作开课了
- 搭建Harbor企业级docker仓库
- anconda安装及opencv配置
- Service-Oriented Architecture,SOA(转)
- Python 小白从零开始 PyQt5 项目实战(2)菜单和工具栏
- 11·25发布!OPPO Reno7系列正式官宣:定位高颜值实力派
- Python - 进程/线程相关整理
- Go语言中的面向对象
- UVA 11044
- SVM的对偶问题与核方法
- 怎么批量调整图片大小
- [Openwrt 项目开发笔记]:DDNS设置(五)
- 一个野生程序员的自我修养
- scikit 线性回归_使用scikit学习线性回归学习和体育运动nba数据数据科学
- 网页版第三方登录操作——微信登录
- 修改系统时区(基于Debian的系统)--用Enki学Linux系列(15)
- window下diskpart给SD卡分区
- 40 sinon spy间谍函数
- js实现时间戳转化为自定义格式的年月日时分秒(yyyy-MM-dd HH:mm:ss)