一、运动目标检测简介  

视频中的运动目标检测这一块现在的方法实在是太多了。运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测。先简单从视频中的背景类型来讨论。
        静态背景下的目标检测,就是从序列图像中将实际的变化区域和背景区分开了。在背景静止的大前提下进行运动目标检测的方法有很多,这些方法比较侧重于背景扰动小噪声的消除,如:
1.背景差分法
2.帧间差分法
3.光流法
4.混合高斯模型(GMM)
5.码本(codebook)
还有这些方法的变种,例如三帧差分,五帧差分,或者这些方法的结合。
      运动背景下的目标检测,相对于静态背景而言,算法的思路就有所区别了,一般会更加侧重于匹配,需要进行图像的全局运动估计与补偿。因为在目标和背景同时运动的情况下,是无法简单的根据运动来判断的。运动背景下的运动目标检测算法也有很多,如
1.块匹配
2.光流估计
      这些方法总得来在不同的环境下说各有各自的特点吧,也不见得简单的算法就一定比复杂的要弱。有一些博客已经对这些方法进行了对比和评估,有兴趣的同学可以参考这些

(摘自http://blog.csdn.net/zouxy09/article/details/9622401
      推荐一个牛逼的库:http://code.google.com/p/bgslibrary/ 里面包含了各种背景减除的方法,可以让自己少做很多力气活。
      还有一篇评估的博文http://www.cnblogs.com/xrwang/archive/2010/02/21/ForegroundDetection.html

二、GMM算法简介


      不得不提的是其中的GMM算法(可以参考Adaptive background mixture models for real-time tracking),这种算法在我平时要用到运动检测的时候一般都会直接用,原因有两个,第一,效果确实不错,噪声可以很快消除,第二,opencv包含了GMM算法,可以直接调用,非常省事。

GMM简单讲,将输入图像的像素与背景模型进行对比,和背景模型相似性比较高的点视为背景,和背景模型相似性比较低的点视为前景,再利用形态学的方法进行运动目标提取。混合高斯模型是由K个(基本为3到5个)单高斯模型加权组成的。在获取新的一帧图像之后,如果当前图像中的像素点与该像素的K个模型中的某一个匹配度比较高,则视为背景,并将当前帧的像素作为一个新模型,更新已存在的K个模型。如果匹配度比较低,则为前景点。整个混合高斯模型算法主要是有方差和均值两个参数,对于这两个参数采取不同的学习机制,直接影响该算法的正确性、稳定性和收敛性。代码网上到处都有,例如http://blog.csdn.net/pi9nc/article/details/21717669,需要的同学可以去看看。

三 、ViBe算法

 

不过,我今天介绍的主角并不是GMM,而是ViBe算法。在网上各处看到ViBe算法是个很牛逼的算法,据说还把GMM给PK下去了,所以我就拜读了原文ViBe: a powerful random technique to estimate the background in video sequences
       ViBe算法是由Olivier Barnich 和 Marc Van Droogenbroeck在2011年提出的一种背景建模方法。该算法采用邻域像素来创建背景模型,通过比对背景模型和当前输入像素值来检测前景,可以细分为三个步骤:
       第一步,初始化单帧图像中每个像素点的背景模型。假设每一个像素和其邻域像素的像素值在空域上有相似的分布。基于这种假设,每一个像素模型都可以用其邻域中的像素来表示。为了保证背景模型符合统计学规律,邻域的范围要足够大。当输入第一帧图像时,即t=0时,像素的背景模型

其中,表示空域上相邻的像素值,表示当前点的像素值。在N次的初始化的过程中,中的像素点被选中的可能次数为L=1,2,3,…,N。

第二步,对后续的图像序列进行前景目标分割操作。当t=k时,像素点的背景模型为,像素值为。按照下面判断该像素值是否为前景。

这里上标r是随机选的;T是预先设置好的阈值。当满足符合背景#N次时,我们认为像素点为背景,否则为前景。

第三步,背景模型更新方法。ViBe算法的更新在时间和空间上都具有随机性。
      时间上的随机性。在N个背景模型中随机抽取一个,设为图像,图2-1表示了图像的x位置及其八邻域内的像素。当我们得到新的一帧图像时,如果图像中的x位置对应的像素被判断为背景,则需要被更新。这个抽取的过程体现了时间上的随机性。
空间上的随机性。在的八邻域中随机抽取一个像素,用的来替换掉,这体现了模型更新空间上的随机性。

以上便是更新的过程,即用来更新及其八邻域。采用八邻域更新的方法,可以去除由于获取的视频细微抖动(摄像机抖动、目标微动)而产生的重影和误差,让检测目标更加准确。

在一般情况下,背景并不会发生较大的变化,所以每次背景模型更新的个数UpdateNum应该是相近的。因此我们把第一帧背景更新的次数InitNum作为比较值,符合下面公式则对背景模型进行重新初始化,这样可以避免由于大面积的光照变化导致的误判。

视频中的初始帧可能是包含目标的,常规的背景建模算法往往无法快速消除Ghost区域,这对于前景检测是不利的。Vibe算法更新模型时利用了该像素值的空间传播特性,背景模型逐渐向外扩散,这也有利于Ghost区域的更快的识别并且消除。下面以ViBe算法下的交通视频前景检测为例

如图上图所示为ViBe算法下前景检测的效果,红色矩形框表示了出现的比较显著的Ghost区域。在第10帧之前,Ghost区域残留严重,随着模型的不断更新,Ghost区域不断消失在第40帧以后,Ghost区域已经完全消失了。说明了Vibe算法在前景检测和背景模型更新上的优势。

代码地址:http://download.csdn.net/detail/zhuangxiaobin/7360113

运动目标检测ViBe算法的更多相关文章

  1. 【计算机视觉】基于局部二值相似性模式(LBSP)的运动目标检测算法

    基于局部二值相似性模式(LBSP)的运动目标检测算法 kezunhai@gmail.com http://blog.csdn.net/kezunhai 本文根据论文:Improving backgro ...

  2. [转]前景检测算法--ViBe算法

    原文:http://blog.csdn.net/zouxy09/article/details/9622285 转自:http://blog.csdn.net/app_12062011/article ...

  3. 运动目标检测中基于HSV空间的阴影去除算法

    在运动目标检测中,常常会出现由于光线被遮挡,或场景其他物体的遮挡,在目标附近或场景里出现阴影,阴影的出现对后期目标的正确分割与处理带了很大的不便.如今,国内外已有不少文献来研究这个问题,并且提出了各种 ...

  4. 【计算机视觉】基于样本一致性的背景减除运动目标检测算法(SACON)

    SACON(SAmple CONsensus)算法是基于样本一致性的运动目标检测算法.该算法通过对每个像素进行样本一致性判断来判定像素是否为背景. 算法框架图 由上图可知,该算法主要分为四个主要部分, ...

  5. 每天进步一点点------Sobel算子(3)基于彩色图像边缘差分的运动目标检测算法

    摘  要: 针对目前常用的运动目标提取易受到噪声影响.易出现阴影和误检漏检等情况,提出了一种基于Sobel算子的彩色边缘图像检测和帧差分相结合的检测方法.首先用Sobel算子提取视频流中连续4帧图像的 ...

  6. 【计算机视觉】背景建模--Vibe 算法优缺点分析

    一.Vibe 算法的优点 Vibe背景建模为运动目标检测研究邻域开拓了新思路,是一种新颖.快速及有效的运动目标检测算法.其优点有以下两点: 1.思想简单,易于实现.Vibe通常随机选取邻域20个样本为 ...

  7. 基于DCT系数的实时监控中运动目标检测

    本文的主要内容来自2009 Advanced Video and Signal Based Surveillance会议的一篇论文“Real-Time Moving Object Detection ...

  8. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  9. EGADS介绍(二)--时序模型和异常检测模型算法的核心思想

    EDADS系统包含了众多的时序模型和异常检测模型,这些模型的处理会输入很多参数,若仅使用默认的参数,那么时序模型预测的准确率将无法提高,异常检测模型的误报率也无法降低,甚至针对某些时间序列这些模型将无 ...

随机推荐

  1. 利用Oracle 发送邮件(utl_smtp)

    发送邮件的方法有很多,.NET前台也可以通过创建邮件类的形式, 通过微软提供的System.Net.Mail.dll 也可以简单的发送邮件.但是代码比较长,操作起来虽然很简单(很多细节忽略了). 这里 ...

  2. mysql优化三

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  3. Python线程指南(转)

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  4. HTML5学习笔记 Geolocation(地理定位)

    HTML5 Geolocation(地理定位)用于定位用户的位置. 定位用户的位置 html5 Geolocation API用于获得用户的地理位置 鉴于该特性可能低侵犯用户的隐私,除非用户同意,否则 ...

  5. C union共用体

    共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 共用体定义: ...

  6. U3D安卓下OnApplicationQuit不执行的解决方法

    安卓下当你按Home键,程序会进入暂停状态.所以只能改成调用OnApplicationPause. Unity论坛上说实现IDispose接口也可以,似乎IOS可以,但安卓测试了,无效.

  7. UIImageView的一些用法

    转自:http://blog.sina.com.cn/s/blog_60e2dbcf01014bfm.html //初始化 UIImageView  *imageView=[[UIImageView ...

  8. 使用 C# 开发智能手机软件:推箱子(十八)

    这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第十八篇.在这篇文章中.介绍 Window/SelectLevelDlg.cs 源程序文件. 这个源程序文件包括 Selec ...

  9. vue 和ng的区别

    vue:    读音:    v-u-e    view vue到底是什么?        一个mvvm框架(库).和angular类似        比较容易上手.小巧    mvc:       ...

  10. js 内置对象常用方法

    1 内容概述 js包含一些内置对象,如Array,Function,String等,这些是基本的,常用的js类,所以了解它们十分重要:把他们的方法,用例子和文字简要的记录下来,方便今后参看. 2 Ar ...