当前位置: 首页 > 编程语言 > C++ > 正文

光流(optical flow)和openCV中实现

时间:2015-05-15

光流的概念:

是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(optical flow)。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。

看下面的图,它展示了一个小球在5个连续的帧中的运动,箭头上的数字代表不同的帧,那个红色小球的运动构成了光流。

操作:

给你一个图上的一系列点,在另外一张图上找到与前面一些列点相同的点。

或者给你图I1上的点[ux, uy]T,找到I2上的点[ux + δx, uy + δy]T,最小化ε:

上面加入Wx表示一块区域,一般跟踪一个区域的点。

在图形学应用中,在多张图上跟踪点(特征)是一项基本的操作:在一张图上找到一个对象,观察对象如何移动。

基于特征点的跟踪算法大致可以分为两个步骤:

1)探测当前帧的特征点;

2)通过当前帧和下一帧灰度比较,估计当前帧特征点在下一帧的位置;

3)过滤位置不变的特征点,余下的点就是目标了。

特征点可以是Harris角点,也可以是边缘点等等。

考虑一个像素在第一帧的光强度(这里增加了一个维度时间,前面的时候我们只是处理图像,所以没有必要时间。现在需要增加这个维度)。它移动了 的距离到一下帧,用了时间。因为像素点是一样的,光强度也没有发生变化(其实这个光强度没有改变是很多光流算法的基本假设)。,所以我们可以说:

然后通过泰勒级数近似展开有:

所以:

上面的等式叫做光流等式,偏导数可以求出来,可是 u和v是未知的,所以无法解决上的等式。但是有很多方法可以解决这个问题,其中一个叫做Lucas-Kanade方法。