提取视频中的前景物体

opencv 帧差法 absdiff

如果摄像机是固定的,那么我们可以认为场景(背景)大多数情况下是不变的,而只有前景(被跟踪的目标)会运动,这样就可以建立背景模型。通过比较当前帧和背景模型,就能轻松地跟踪目标运动情况了。这里,最容易想到的比较方式就是当前帧减去背景模型了

void AbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );
  src1
  第一个原数组
  src2
  第二个原数组
  dst
  输出数组
  函数 cvAbsDiff 计算两个数组差的绝对值
  dst(I)c = abs(src1(I)c - src2(I)c).
  所有数组必须有相同的数据类型相同的大小(或ROI大小)

在实际生活中,很难有完全的背景,

因此有必要动态地构建背景模型,实现方法是观察该场景并持续一段时间。如果我们假设在
每个像素位置,背景在绝大部分时间都是可见的,那么建立背景模型的方法就很简单,只需计算
所有观察结果的平均值即可。但这种做法其实并不可行。首先,在计算背景之前需要存储大量的
图像;其次,在为计算平均值而累计图像的时候,并没有提取到前景物体。这种解决方案还需要
考虑两个问题:为了计算可靠的背景模型,需要累计何时的、多少数量的图像。另外,如果有些
图像中的某个像素正在监视一个前景物体,那么它们就会对计算平均背景产生很大的影响。
更好的策略是用定时更新的方式,动态地构建背景模型。实现方法是计算滑动平均值(又叫
移动平均值)。这是一种计算时间信号平均值的方法,该方法还考虑了最新收到的数值。假设p
是时间t的像素值,41是当前的平均值,那么要用下面的公式来更新平均值
A1=(1-a)H1-1+aP
其中参数a称为学习速率,它决定了当前值对计算平均值有多大影响。这个值越大,滑动平
均值对当前值变化的响应速度就越快;但如果学习速率太大,缓慢移动的物体就可能会消失在背
景中。实际上,应该采用多大的学习速率在很大程度上取决于场景的变化速度。为了构建背景模
型,必须在新的帧到达时对每个像素计算滑动平均值。然后就可以根据当前图像与背景模型之间
的差异,判断一个像素是否为前景像素。

如何进行背景累加

void cv::accumulateWeighted    (    InputArray     src,
InputOutputArray     dst,
//alpha*src+(1-alpha)*dst double alpha, InputArray mask = noArray() //掩码 )

即,alpha 调节更新速度(蓄能器"忘记"早期图像的速度)。该功能支持多通道图像。每个通道都独立处理

扩展:混合高斯模型:Opencv3之动态目标检测:BackgroundSubtractorMOG2参数配置_沐阳2100的博客-CSDN博客

上一篇:利用python实现windows下文件名批量修改


下一篇:opencv——几何变换原理与实现