参考:
wiki:https://zh.wikipedia.org/wiki/%E5%85%89%E6%B5%81%E6%B3%95
《学习opencv》第十章
光流(Optical flow or optic flow)是关于视域中的物体运动检测中的概念。用来描述相对于观察者的运动所造成的观测目标、表面或边缘的运动。光流法在样型识别、计算机视觉以及其他影像处理领域中非常有用,可用于运动检测、物件切割、碰撞时间与物体膨胀的计算、运动补偿编码,或者通过物体表面与边缘进行立体的测量等等。
光流法
光流法实际是通过检测图像像素点的强度随时间的变化进而推断出物体移动速度及方向的方法。
在 2D+t 维的情况下(3D 和更高维度亦然),假设位于
(x,y,t)
的体素的亮度是
I(x,y,t)
。该体素在两个图像帧之间移动了
Δx
、
Δy
、
Δt
。于是可以得出一个亮度相同的结论:
假设该移动很小,那么可以根据泰勒级数得出:
因此可以推出:
或
最终可得出结论:
这里的 Vx,Vy 是 x 和
或
LK光流法
在计算机视觉中,卢卡斯-金出方法是一种广泛使用的光流估计的差分方法,这个方法是由Bruce D. Lucas和Takeo Kanade发明的。它假设光流在像素点的邻域是一个常数,然后使用最小二乘法对邻域中的所有像素点求解基本的光流方程。
通过结合几个邻近像素点的信息,卢卡斯-金出方法(简称为L-K方法)通常能够消除光流方程里的多义性。而且,与逐点计算的方法相比,L-K方法对图像噪声不敏感。不过,由于这是一种局部方法,所以在图像的均匀区域内部,L-K方法无法提供光流信息。
LK算法基于以下三个假设:
- 亮度恒定,就是同一点随着时间的变化,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程;
f(x)≡I(x(t),t)=I(x(t+dt),t+dt)
很简单,公式的意思就是被跟踪像素的灰度不随时间变化而变化:
∂f(x)∂x=0 - 小运动,这个也必须满足,就是时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导(换句话说,小运动情况下我们才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数),这也是光流法不可或缺的假定;
- 可以将运动变化看成是亮度对时间的导数,即断言一个序列中相邻帧之间的变化是小微分的。
- 空间一致,一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。这是Lucas-Kanade光流法特有的假定,因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。我们假定特征点邻域内做相似运动,就可以连立n多个方程求取x,y方向的速度(n为特征点邻域总点数,包括该特征点)。
L-K方法假设两个相邻帧的图像内容位移很小,且位移在所研究点p的邻域内为大致为常数。所以,可以假设光流方程 在以p点为中心的窗口内对所有的像素都成立。也就是说,局部图像流(速度)向量
(Vx,Vy)
须满足:
其中, q1,q2,…,qn 是窗口中的像素, Ix(qi),Iy(qi),It(qi) 是图像在点 qi 和当前时间对位置 x ,
这些等式可以写成矩阵的形式
此方程组的等式个数多于未知数个数,所以它通常是超定的。L-K方法使用最小二乘法获得一个近似解,即计算一个2x2的方程组:
ATAv=ATb 或
v=(ATA)−1ATb
其中, AT 是矩阵 A 的转置。即计算:
对
i=1
到
n
求和。
矩阵