上一篇主要是介绍了光流的基本概念,希望大家对于光流是什么,有什么用能有一些体会,这回要给各位介绍的是一种经典的光流求解方法:Lucas-Kanade法,本篇的脉络如下: 首先简单回顾一下始解篇中的内容,然后进行Lucas-Kanade公式的推导,谈谈我的理解,最后给出伪代码加深大家对此方法的印象.
1. 始解篇的回顾
运动物体上的一点在不同时刻出现在图像平面的不同位置,我们要跟踪物体,那就是要跟踪这些个点,但如何跟踪他们呢? 我们假设只要是同一点它的光度始终保持不变即对同一点,其中 表示点的光度, 关于时间 t 求导,我们就得到一个光流约束方程:
(1)
这里的即是我们要求的光流,不过麻烦的是这里有两个未知数(u_x,u_y)但是却只有一个方程,所以我们无法求解,需要想办法再加入一个约束条件(即方程),好了,现在你是否有点体会,其实这些方法都不过是在想法加方程然后联立求解罢了,那,这一篇的角儿Lucas-kanade光流法又是如何加入约束从而求得光流的呢?
2. Lucas-Kanade光流法
Lucas-Kanade光流法是20世纪80年代提出的方法,现如今已经30年了,也不知道是不是过时了,现在应该有更先进的方法了吧,本人才疏学浅,望各位多指教才是。好了,闲话不叙,开始介绍Lucas-kanade 的理论吧。以帧与帧之间的时间很短、物体的运动很很不明显为前提,我们可以假设说在图像上的局部小范围内(比如一个axa=m的小窗口)相近像素点的光流(速度)相等,如果这个局部小范围内有m个像素点,结合光流约束方程,我们就可以得到m个方程:
转换成矩阵表示:
好拉,看起来很瑰伟,m个方程2个未知数,爱怎么求怎么求,感觉都浪费了这么些资源,但这样的推导是对的吗?请各位稍加考虑一下.
。。。。。。。
看出问题来没?
注意我们在对邻近像素点做速度假设的时候,光流约束方程(1)中的u已经不再是原来那个u了,u已经成了估计值,用表示,再重复一遍: u已经不是真实值,而只是真实值的一个估计,用表示.
现在我们来仔细观察,如果你还记得上章提到的它的泰勒展开
(2)
上式中画箭头的三项是未知的,因为u变成估计值,所以式子中也应该是对的估计,表示成, 另外由光度不变(这个条件始终不变)得知
其中
而
(3)其中为估计误差.
由方程(2)(3),可知光流约束方程变成
(4)
得到新的光流约束方程(4)后,我们来重新分析,假设选择的窗口有m个像素点,我们可以得到m个方程:
转换成矩阵表示:
然后就是应用最小二乘法拉(least-square)拉,关于这个方法我会专门写一篇文章,这里就先不赘述了。最小二乘法需要一个cost function,这里是
其中
要使这个cost function最小,我们通常的方法就是对其求导,令其为零
=>
令
![]()
如果M非奇(满秩)则光流可解得
如果M奇异,即意味着又变回只有一个方程的情形了,只能求得沿光度梯度方向的光流。
还有,窗口大小通常取5×5,太小就容易出现aperture problem(M奇异),那样求出的光流就可能无法描述物体的运动,之所以说“可能”的原因是如果物体恰巧沿光度梯度方向,那算是撞上了,好了关于aperture problem,有空的话我会写一篇文章讨论下,先不多说了。
3. Lucas-Kanade光流法伪代码
首先,明确目标:tracking!由imageA上的一点p,得出其在imageB上的对应点q.
imageA上的光强记为I(x,y),B上的光强记为J(x,y) 假设在imageA找到number_features个特征点,位置信息存在features[] 数组中 设窗口大小w=5 for i=0 up to number_features with step of +1 /*微分在实现当中都是利用差分近似,这里用的是centrl difference operator,还有很多别的算子如Sharr operator Sobel operator,opencv用的就是sobel 算子*/ x方向上的光度梯度: y方向上的光度梯度: t方向上的光度变化: 计算系数矩阵M:计算矩阵b:
/*判断M是即否奇异,求解光流*/ if (|M|) { /*正常矩阵运算求得光流*/ }else { /*只能计算normal flow*/ } end of for-loop on i
这一篇大概就这样了,下一篇将会介绍pyramid Lucas-Kanade optical flow method。
如若转载,恳请注明:转载自 yaoyi大白的博客 http://www.linyaoyi.com
-----------------------to be continue---