前段时间研究了下Vibe目标检算法并做了代码实现,今天得空讲下我对Vibe算法的理解。
算法官方网站:http://www.telecom.ulg.ac.be/research/vibe/
综述:
ViBe是一种像素级视频通过背景建模的方式来检测前景目标的算法。具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。
相对一般的目标检测算法有以下几个优点:
1、背景的初始化比较迅速,通常一帧就能搞定,但实际运行时可以能也可能因此而引入Ghost区域。但随着程序运行Ghost区域会被消除。
2、占用内在较少,每个像只需要比较一次,且比较算法简单,不会占用太多内存。
3、不易引入Ghost区域,所谓Ghost区域就是:在前后背景的目标检测中当一个原本静止的物体开始运动,背景差检测算法可能会将该目标原本所覆盖的区域错误的检测目标区域,这块区域就成为Ghost。当然原来运动的物体变为静止的也会引入Ghost区域。
下面分几大模块讲述Vibe目标检测的主要思想:
1、Vibe模型的初始化:
通用的检测算法的初始化需要一定长度的视频序列来完成背景模型构造,不利于对实时性要求较高的目标检测。ViBe的初始化仅仅通过一帧图像即可完成,就是:对于一个像素点,随机的选择它的3X3领域内的点的像素值作为,该点的背景模型样本集,本源码中为每个像素点建立总量为20的样本集来表达该点的背景(这是根据图像中相近的像素点总是相似的)。这种初始化方法能快速建立初始的背景模型,同时它能规避一些的噪声的影响,如果了解一些去噪算法的人知道去噪其实就是利用相邻像素相近的原理来滤波实现去噪,比如高斯去噪。另外它有个缺点,初始时容易引起Ghost区域,比如第一帧如果有前景目标在图像中,会在初始时把其设成背景像素点。
源码如下:
for(usYIdx = 1; usYIdx < usVibeAreaHgt-1; usYIdx++) /*周围一圈的图像信息不要了*/
{
uiYTtlIdx = usYIdx * usVibeAreaStp;
for(usXIdx = 1; usXIdx < usVibeAreaWth-1; usXIdx++)
{
uiXTtlIdx = uiYTtlIdx + usXIdx;
for(ucSmpleIdx = 0; ucSmpl