背景建模与前景检测(Background Generation And Foreground Detection)

作者:王先荣

前言
    在很多情况下,我们需要从一段视频或者一系列图片中找到感兴趣的目标,比如说当人进入已经打烊的超市时发出警报。为了达到这个目的,我们首先需要“学习”背景模型,然后将背景模型和当前图像进行比较,从而得到前景目标。

背景建模
    背景与前景都是相对的概念,以高速公路为例:有时我们对高速公路上来来往往的汽车感兴趣,这时汽车是前景,而路面以及周围的环境是背景;有时我们仅仅对闯入高速公路的行人感兴趣,这时闯入者是前景,而包括汽车之类的其他东西又成了背景。背景建模的方式很多,或高级或简单。不过各种背景模型都有自己适用的场合,即使是高级的背景模型也不能适用于任何场合。下面我将逐一介绍OpenCv中已经实现,或者在《学习OpenCv》这本书中介绍的背景建模方法。
1.帧差
    帧差可说是最简单的一种背景模型,指定视频中的一幅图像为背景,用当前帧与背景进行比较,根据需要过滤较小的差异,得到的结果就是前景了。OpenCv中为我们提供了一种动态计算阀值,然后用帧差进行前景检测的函数——cvChangeDetection(注:EmguCv中没有封装cvChangeDetection,我将其声明到OpenCvInvoke类中,具体实现见文末代码)。而通过对两幅图像使用减法运算,然后再用指定阀值过滤的方法在《学习OpenCv》一书中有详细的介绍。它们的实现代码如下:

帧差

对于类似无人值守的仓库防盗之类的场合,使用帧差效果估计很好。

2.背景统计模型
    背景统计模型是:对一段时间的背景进行统计,然后计算其统计数据(例如平均值、平均差分、标准差、均值漂移值等等),将统计数据作为背景的方法。OpenCv中并未实现简单的背景统计模型,不过在《学习OpenCv》中对其中的平均背景统计模型有很详细的介绍。在模仿该算法的基础上,我实现了一系列的背景统计模型,包括:平均背景、均值漂移、标准差和标准协方差。对这些统计概念我其实不明白,在维基百科上看了好半天 -_-
调用背景统计模型很简单,只需4步而已:

//(1)初始化对象
BackgroundStatModelBase<Bgr> bgModel = new BackgroundStatModelBase<Bgr>(BackgroundStatModelType.AccAvg);
//(2)更新一段时间的背景图像,视情况反复调用(2)
bgModel.Update(image);
//(3)设置当前帧
bgModel.CurrentFrame = currentFrame;
//(4)得到背景或者前景
Image<Gray,Byte> imageForeground = bgModel.ForegroundMask;

背景统计模型的实现代码如下:

实现背景统计模型

3.编码本背景模型
    编码本的基本思路是这样的:针对每个像素在时间轴上的变动,建立多个(或者一个)包容近期所有变化的Box(变动范围);在检测时,用当前像素与Box去比较,如果当前像素落在任何Box的范围内,则为背景。
    在OpenCv中已经实现了编码本背景模型,不过实现方式与《学习OpenCv》中提到的方式略有不同,主要有:(1)使用单向链表来容纳Code Element;(2)清除消极的Code Element时,并未重置t。OpenCv中的以下函数与编码本背景模型相关:
cvCreateBGCodeBookModel  建立背景模型
cvBGCodeBookUpdate       更新背景模型
cvBGCodeBookClearStale   清除消极的Code Element
cvBGCodeBookDiff         计算得到背景与前景(注意:该函数仅仅设置背景像素为0,而对前景像素未处理,因此在调用前需要将所有的像素先置为前景)
cvReleaseBGCodeBookModel 释放资源
    在EmguCv中只实现了一部分编码本背景模型,在类BGCodeBookModel<TColor>中,可惜它把cvBGCodeBookDiff给搞忘记了 -_-
下面的代码演示了如果使用编码本背景模型:

编码本模型

4.高级背景统计模型
    在OpenCv还实现了两种高级的背景统计模型,它们为别是:(1)FGD——复杂背景下的前景物体检测(Foreground object detection from videos containing complex background);(2)MOG——高斯混合模型(Mixture Of Gauss)。包括以下函数:
CvCreateFGDetectorBase  建立前景检测对象
CvFGDetectorProcess     更新前景检测对象
CvFGDetectorGetMask     获取前景
CvFGDetectorRelease     释放资源
    EmguCv将其封装到类FGDetector<TColor>中。我个人觉得OpenCv在实现这个模型的时候做得不太好,因为它将背景建模和前景检测糅合到一起了,无论你是否愿意,在建模的过程中也会检测前景,而只希望前景检测的时候,同时也会建模。我比较喜欢将背景建模和前景检测进行分离的设计。
调用的过程很简单,代码如下:

高级背景统计模型

前景检测
    在建立好背景模型之后,通过对当前图像及背景的某种比较,我们可以得出前景。在上面的介绍中,已经包含了对前景的代码,在此不再重复。一般情况下,得到的前景包含了很多噪声,为了消除噪声,我们可以对前景图像进行开运算及闭运算,然后再丢弃比较小的轮廓。

本文的代码

本文代码

另外,细心的读者发现我忘记贴OpenCvInvoke类的实现代码了,这里补上。多谢指正。

OpenCvInvoke实现代码

后记
    值得注意的是,本文提到的OpenCv函数目前属于CvAux系列,以后也许会加入到正式的图像处理Cv系列,也许以后会消失。最重要的是它们还没有正式的文档。

其实关于背景模型的方法还有很多,比如《Video-object segmentation using multi-sprite background subtraction》可以在摄像机运动的情况下建立背景,《Nonparametric background generation》利用mean-shift算法处理动态的背景模型,如果我的时间和能力允许,也许会去尝试实现它们。另外,《Wallflower: Principles and practice of background maintenance》比较了各种背景建模方式的差异,我希望能够尝试翻译出来。

感谢您耐心看完本文,希望对您有所帮助。

背景建模与前景检测1(Background Generation And Foreground Detection)相关推荐

  1. 背景建模与前景检测3(Background Generation And Foreground Detection Phase 3)

    背景建模与前景检测之三(Background Generation And Foreground Detection Phase 3) 作者:王先荣 在上一篇文章里,我尝试翻译了<Nonpara ...

  2. 背景建模与前景检测2(Background Generation And Foreground Detection Phase 2)

    背景建模与前景检测2(Background Generation And Foreground Detection Phase 2) 作者:王先荣 本文尝试对<学习OpenCV>中推荐的论 ...

  3. ViBe(Visual Background extractor)背景建模或前景检测

    ViBe算法:ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网: ...

  4. 背景建模或前景检测(Background Generation And Foreground Detection) 二

    转自:http://www.cnblogs.com/xrwang/archive/2010/03/27/BackgroundGenerationAndForegroundDetectionPhase2 ...

  5. 基于平均背景建模的运动目标检测

    建立一个场景模型,包含图像灰度均值.帧间平均差值. 对于输入的后续视频,当灰度在区间内时,认为是静止区域,反之为运动目标.判断静止灰度区间为: diff实际上可认为是为了抑制一定的噪声,当图像序列噪声 ...

  6. 0057-在OpenCV环境下使用KNN背景建模提取前景目标

    博主注: 已于2022-06-01重写这篇博文,链接如下 https://blog.csdn.net/wenhao_ir/article/details/125007017​​​​​​​ 博主注: 已 ...

  7. 0056-在OpenCV环境下使用混合高斯背景建模提取前景目标

    博主注: 已于2022-06-01重写这篇博文,有两个链接,分别如下 https://blog.csdn.net/wenhao_ir/article/details/125010301 https:/ ...

  8. Background Subtraction and Modeling 常见的目标检测中的背景建模方法漫谈

    转载者的话: 最近一直在看background subtraction and modeling.正如如下链接的第一个回帖所说,背景建模虽然最近研究不是很热,但对视频的处理至关重要,甚至直接影响一个系 ...

  9. 目标检测中背景建模方法

    FROM: http://www.cnblogs.com/ronny/archive/2012/04/12/2444053.html 最近一直在做前景检测方面的研究,刚开始主要是做一些工程性的应用,为 ...

最新文章

  1. JOGL - Java与OpenGl的绑定(转)
  2. 线程退出【Linux学习】pthread_create主线程与创建的新线程之间退出关系
  3. leetcode 110. 平衡二叉树
  4. android gridview显示本地图片大小,在Android上的GridView中调整图像大小
  5. mysql 无符号 负数_mysql – BETWEEN使用负值和无符号整数
  6. jquery实现某宝放大点击切换
  7. SOA架构,面向信号怎么就不香了,以及工程师的四个技术维度:编程,架构,网络,工具
  8. html怎么用excel打开乱码,我的Excel表格打开就乱码了,请问该如何修复?
  9. oracle临时表怎么删除吗,删除Oracle临时表
  10. SQL中EXISTS的用法
  11. Games102_lecture8几何建模与处理基础_离散微分几何,Utopia框架介绍
  12. spring boot(四):thymeleaf使用详解
  13. app注册协议通用模版
  14. 崩坏3区号+86_手机号码前的“+86”是什么意思?
  15. 谈性能测试-FPS流畅度
  16. StarUML使用说明
  17. Ubuntu20.04.3LTS安装/配置
  18. VVIC根据ID取商品详情
  19. 004.python科学计算库pandas(中)
  20. python-selenium登陆今日头条

热门文章

  1. Git创建repository,以及clone,提交一个repository
  2. python str byte编码_Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题...
  3. leetcode算法题--盛最多水的容器
  4. python面向什么编程_python基础-面向过程编程
  5. python没用_大部分Python资料都没有说到的重点-用实战教你解决问题的思路
  6. linux查看nginx运行状态,如何查看nginx运行状态及相关属性说明
  7. python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
  8. [osgearth][原]仿照谷歌,修改oe漫游器中focal(视角切换)功能
  9. java非递归方式实现快速排序
  10. 【微信小程序】scroll-view与Page下拉冲突