您的位置:首页 > 编程语言

ViBe背景建模算法简介和代码分析

2014-11-21 12:27 232 查看
ViBe是近几年比较火的一种背景建模算法,该算法主要有以下四个特点:

第一,以历史数据作为背景模型:每个位置的背景模型实质是历史像素值。

第二,随机性:背景模型的初始化和更新方式依概率进行。

第三,邻域操作:当前位置的背景模型初始化时,数据采集自邻域像素;当前位置的背景模型进行更新时,会扩散到邻域。

第四,纯整型运算,无浮点数运算,运算效率高。

该算法的流程也特别简单:

初始化阶段:用一帧画面进行背景建模,每个位置的背景模型从该位置的邻域中进行多次随机采样得到。

匹配和更新阶段:计算每个位置的像素和该位置的背景模型样本值的距离,如果距离小于某个阈值的背景模型样本数大于某个阈值,则认为当前位置为背景,否则为前景。如果当前位置为前景,则以一定的概率更新该位置的某个背景模型样本值,并且以一定的概率更新某个邻域的背景模型的某个样本值。

具体的过程在原作者发表在IEEE Transactions on Image Processing中的论文的附录中已有很详细的说明,简单易懂,这里不再重复。

ViBe的代码实现起来也比较简单。在CSDN上也有不少博主给出了源代码,我注意到好几个版本的代码在效率方面都有明显的不足。最主要的问题在于访问读入图片的像素和背景模型样本值的方法上。有的作者用cv::Mat::at()函数遍历图像中的每个像素,造成处理时间较长,体现不出ViBe算法的时间优势。下面给出我的一个实现代码,并且在代码中给出了比较详细的分析注释。

这个版本的代码完全采用指针操作访问读入图片的像素和背景模型样本值,保证了效率。我的台式机的CPU是i3-2120,开发环境是vs2010,OpenCV是2.4.5的32位版,下面的三个文件编译好,处理320x240像素的彩色图和灰度图,在release模式下,一帧的运行时间基本都在5毫秒以下。

另外,我在实现随机数时,既没有采用C标准库中的函数,也没有采用OpenCV的随机数,而是用时钟周期计数自累加取模操作实现。经过我的实验发现,采用真正的随机数或者这里给出的实现方式,得到的前景检测结果没有明显的差别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: