vibe算法 c++实现

本文详细介绍了VIBE算法,一种视觉背景提取方法,优于GMM。首先阐述了模型原理,将前景提取视为分类问题,通过样本集判断像素是否属于背景。接着讨论了算法的初始化,仅需单帧图像,但可能导致运动物体产生“鬼影”现象。最后,分析了不同更新策略,包括保守和盲目更新,并提到了无记忆、时间取样和空间邻域三种具体策略。此外,文章还提及了C++实现和相关参考文献。
摘要由CSDN通过智能技术生成

vibe算法

vibe 全称是 visual background extractor。算法性能很好,甚至优于GMM。我们从三个方面分析一下:
(1)what is the model and how does it behave?
(2)how is the model initialized?
(3)how is the model updated over time?

模型原理

我们可以将前景提取问题看作是一个分类问题。对每一个像素点,为了避免某个异常值对结果产生较大的影响,采用的方法是为每一个像素点搭配了一组样本值。组内的值是该像素的过去值以及邻居点的像素值。对于每一个新的像素值,经过比较判断是否属于背景点。具体的比较方法如下:

我们设样本集为M(x),x是该像素点,v1~vn是n个样本值。v(x)是x处的像素值。
在这里插入图片描述
以v(x)的值为半径画圆
在这里插入图片描述

在这里插入图片描述
当圆内样本值的个数超过一定阈值,我们就认为该像素值为背景。

初始化

vibe算法的初始化比较特殊,特殊之处在于,只需要单帧图像即可完成初始化,GMM需要一定的视频序列。
由于像素点及其领域的相似性,我们随机在像素点的领域中选取某一点的像素值作为模型样本值。
可以用下式表示这一过程:
在这里插入图片描述
通过实际检验,这种方法是比较成功的,唯一的缺点是第一帧中的运动object可以会造成ghost现象。

更新策略

实时更新背景模型的重要性不言而喻,更新的过程需要能够处理光线的变化以及对新出现的物体的正确分类。我们需要解决的问题是如何判断那些像素在帧变化过程中应该保留或者更新,以及保留时间等等。
一般的更新策略可以分为conservative和blind两种。
保守的更新策略:一旦被分类为前景点,那么将不再有机会被划分到背景部分。即如果一开始被误以为是运动物体,将持续被认为是前景。
盲目的更新策略:对死锁不敏感。不论样本是否被划分为背景,样本都可能会被更新到背景当中。这样更新的问题是,当运动目标的运动较为缓慢时,也会被分类到背景当中。

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

1).无记忆更新策略

每次确定需要更新像素点的背景模型时,以新的像素值随机取代该像素点样本集的一个样本值。

2).时间取样更新策略

并不是每处理一帧数据,都需要更新处理,而是按一定的更新率更新背景模型。当一个像素点被判定为背景时,它有1/rate的概率更新背景模型。rate是时间采样因子,一般取值为16。

3).空间邻域更新策略

针对需要更新像素点,随机的选择一个该像素点邻域的背景模型,以新的像素点更新被选中的背景模型。

代码部分

#include <iostream>
#include <string.h>
#include <stdio.h>
#include "BackgroundSubtract.h"

using namespace std;

int main(int argc, char* argv[])
{
	c
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值