http://blog.csdn.net/lctm2005/article/details/6282879
在背景更新中不使用标准卡尔曼滤波,而是使用卡尔曼滤波的简化版本,具体公式如下:
1、B(i,j,k+1)=B(i,j,k)+g(k)*(I(i,j,k)-B(i,j,k))
2、g(k)=β*(1-M(i,j,k))+α*M(i,j,k)
3、if |I(i,j,k)-B(i,j,k)|>Th
M(i,j,k)=1
else
M(i,j,k)=0
说明:1、B(i,j,k)为K时刻背景帧,B(i,j,k+1)为K+1时刻背景帧
2、α为运动因子,β为背景因子,这里取经验值分别为 0.055 , 0.1
3、 I(i,j,k)为当前帧
4、Th为阈值,根据视频效果选取
实现中需要注意的地方:
1、区别M(i,j,k)值判定及B(i,j,k+1)=B(i,j,k)+g(k)*(I(i,j,k)-B(i,j,k))中的|I(i,j,k)-B(i,j,k)|和I(i,j,k)-B(i,j,k),I(i,j,k)-B(i,j,k)不能简单的用cvAbsDiff实现,因为它不取绝对值。
2、对背景帧的修改可以创建一个新图,利用cvSetReal2D函数对其赋值后,利用cvCopy拷贝回背景帧。注意在赋值及拷贝之前最好对图片进行清零,利用函数cvZero。
3、IplImage*变量使用前要记得用cvCreateImage初始化