首页未分类使用Vibe算法分割前景片段站长QQ:926563750

浏览

0

回复

使用Vibe算法分割前景片段

作者:admin | 分类:未分类 | 标签:

前景检测的算法有很多,最近想用Vibe来检测前景并分割出片段来。本身没有强大到能自己编写Vibe代码,用的是某位大牛基于原文开发的代码大笑,只是在上面添加一些自己需要的功能而已。利用Vibe算法进行检测和二值化,我们提取检测结果,分析结果,合成动态片段。

一、Vibe算法(引自:http://blog.csdn.net/stellar0/article/details/8777283


ViBe算法详解:

         ViBe是本篇论文中所提出的一个检测方法,相比于其他方法它有很多的不同和优点。具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。该模型主要包括三个方面:模型的工作原理;模型的初始化方法;模型的更新策略。

模型的工作原理

背景物体就是指静止的或是非常缓慢的移动的物体,而前景物体就对应移动的物体。所以我们可以把物体检测看出一个分类问题,也就是来确定一个像素点是否属于背景点。在ViBe模型中,背景模型为每个背景点存储了一个样本集,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。可以知道如果一个新的观察值属于背景点那么它应该和样本集中的采样值比较接近。

具体的讲,我们记v(x):x点处的像素值;M(x)={V1,V2,…VN}为x处的背景样本集(样本集大小为N);SR(v(x)):以x为中心R为半径的区域,如果M(x) [{SR(v(x))∩ {v1,v2, . . . , vN}}]大于一个给定的阈值#min,那么就认为x点属于背景点。

模型的初始化方法

初始化就是建立背景模型的过程。通用的检测算法的初始化需要一定长度的视频序列来完成,通常要耗费数秒的时间,这极大的影戏的检测的实时性,对于手持相机实时拍照来讲并不合适。ViBe的初始化仅仅通过一帧图像即可完成。ViBe初始化就是填充像素的样本集的过程但是由于在一帧图像中不可能包含像素点的时空分布信息,我们利用了相近像素点拥有相近的时空分布特性,具体来讲就是:对于一个像素点,随机的选择它的邻居点的像素值作为它的模型样本值。M0(x) = {v0(y | y ∈NG(x))},t=0初始时刻,NG(x)即为邻居点 。这种初始化方法优点是对于噪声的反应比较灵敏,计算量小速度快,可以很快的进行运动物体的检测,缺点是容易引入Ghost区域。

模型的更新策略

背景模型的更新就是使得背景模型能够适应背景的不断变化,比如光照的变化,背景物体的变更等等。保守的更新策略:前景点永远不会被用来填充背景模型,会引起死锁,比如初始化的时候如果一块静止的区域被错误的检测为运动的,那么在这种策略下它永远会被当做运动的物体来对待;Blind策略:对死锁不敏感,前景背景都可以来更新背景模型,缺点是缓慢移动的物体会融入背景中无法被检测出来。在本方法中采用的更新策略是保守的更新策略+前景点计数方法。前景点计数:对像素点进行统计,如果某个像素点连续N次被检测为前景,则将其更新为背景点。

随机的子采样:在每一个新的视频帧中都去更新背景模型中的每一个像素点的样本值是没有必要的,当一个像素点被分类为背景点时,它有1/ φ的概率去更新背景模型。

具体的更新方法:每一个背景点有1/ φ的概率去更新自己的模型样本值,同时也有1/ φ的概率去更新它的邻居点的模型样本值。更新邻居的样本值利用了像素值的空间传播特性,背景模型逐渐向外扩 散,这也有利于Ghost区域的更快的识别。同时当前景点计数达到临界值时将其变为背景,并有1/ φ的概率去更新自己的模型样本值。

在选择要替换的样本集中的样本值时候,我们是随机选取一个样本值进行更新,这样可以保证样本值的平滑的生命周期由于是随机的更新,这样一个样本值在时刻t不被更新的概率是 (N-1)/N,假设时间是连续的,那么在dt的时间过去后,样本值仍然保留的概率是

也可以写作, 


这就表明一个样本值在模型中是否被替换与时间t无关 ,随机策略是合适的。


Vibe源代码:

http://pan.baidu.com/share/link?shareid=409860&uk=3373051938


原文的实验效果:




      之所以选用Vibe是因为他的自适应能力。他会迅速将不变背景更新到当前状态。(虽然还是解决不了一大难题——逗留),但是通过设定阈值可以定义前景的标准。每个像素属于前景的模型的参数是可以修改的。而且,Vibe的更新能很快消除抖动或背景光照的变化。基于此,我是用这样的简单方法分割动态片段的:

       首先,在每一帧进行前景检测时,对检测的结果进行前景像素统计。当然,原文里的是没有这个函数,但是他有一个update函数,可以对每一帧的每个像素进行判别和更新,这里我将update的类型改为int,并Return一个统计结果。这不影响原函数的更新和判别功能。只要在里面增加一个Numforeground++来计数就行。

       得到的统计结果后就要进行动态帧的判别。当然先要设定一个前景像素比例的阈值。当统计的每一帧的前景像素比例超过了阈值就可以将这一帧视为动态帧,然后保存(截取),否则继续下一帧的检测和判别。直到结束。

本人也是刚学OpenCV不久,所以代码里面的许多东西只能照葫芦画瓢。实验效果如下:




这里面的背景小白点是摄像头自身的抖动和噪声问题,本来还有更多的噪声,但是因为参数设定较大,直接过滤了。


       总之,用大牛们的研究和代码成果直接来做我们自己的工程是件很有趣的事。我们不见得有大牛们那种慧根,但是我对他们充满敬仰,在这工程中能学习到很闷的思维方式,编程习惯,当然获益不浅。(刚开始写博文,内功很浅,还望给位包含和指正!)

代码在这里就不贴了(*^__^*) ……


本文链接:http://cvchina.net/post/9.html
原创文章如转载请注明:转载自计算机视觉网-AI技术供需平台-计算机视觉论坛谢谢!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。