经典的光流求解方法:Lucas-Kanade法

上一篇主要是介绍了光流的基本概念,希望大家对于光流是什么,有什么用能有一些体会,这回要给各位介绍的是一种经典的光流求解方法: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个方程:

I_{x_1}u_x+I_{y_1}u_y=-I_{t_1}//I_{x_2}u_x+I_{y_2}u_y=-I_{t_2}///cdots/cdots//I_{x_m}u_x+I_{y_m}u_y=-I_{t_m}

转换成矩阵表示:

 /begin{pmatrix} I_{x_1}&I_{y_1}// I_{x_2}&I_{y_2}//.&.//.&.//I_{x_m}&I_{y_m}/end{pmatrix}/begin{pmatrix}u_x//u_y/end{pmatrix}=-/begin{pmatrix}I_{t_1}//I_{t_2}//.//.//I_{t_m}/end{pmatrix}

好拉,看起来很瑰伟,m个方程2个未知数,爱怎么求怎么求,感觉都浪费了这么些资源,但这样的推导是对的吗?请各位稍加考虑一下.
。。。。。。。
看出问题来没?
注意我们在对邻近像素点做速度假设的时候,光流约束方程(1)中的u已经不再是原来那个u了,u已经成了估计值,用表示,再重复一遍: u已经不是真实值,而只是真实值的一个估计,用表示.
现在我们来仔细观察,如果你还记得上章提到的它的泰勒展开

/hat{I}(x+/delta{x},y+/delta{y},t+/delta{t})/approx{I(x,y,t)+I_x/hat{u}_x+I_y/hat{u}_y+I_t}///uparrow/qquad/qquad/qquad/qquad/qquad/qquad/qquad/qquad/quad/uparrow/qquad/quad/uparrow  (2)

上式中画箭头的三项是未知的,因为u变成估计值,所以式子中也应该是对的估计,表示成, 另外由光度不变(这个条件始终不变)得知

其中

 (3)其中为估计误差.

由方程(2)(3),可知光流约束方程变成

 (4)

得到新的光流约束方程(4)后,我们来重新分析,假设选择的窗口有m个像素点,我们可以得到m个方程:

I_{x_1}/hat{u}_x+I_{y_1}/hat{u}_y+I_{t_1}=/hat{/varepsilon_1}//I_{x_2}/hat{u}_x+I_{y_2}/hat{u}_y+I_{t_2}=/hat{/varepsilon_2}///cdots/cdots//I_{x_m}u_x+I_{y_m}u_y+I_{t_m}=/hat{/varepsilon_m}

转换成矩阵表示:

 /begin{pmatrix} I_{x_1}&I_{y_1}// I_{x_2}&I_{y_2}//.&.//.&.//I_{x_m}&I_{y_m}/end{pmatrix}/begin{pmatrix}u_x//u_y/end{pmatrix}+/begin{pmatrix}I_{t_1}//I_{t_2}//.//.//I_{t_m}/end{pmatrix}=/begin{pmatrix}/hat{/varepsilon_1}///hat{/varepsilon_2}//.//.///hat{/varepsilon_m}/end{pmatrix}

然后就是应用最小二乘法拉(least-square)拉,关于这个方法我会专门写一篇文章,这里就先不赘述了。最小二乘法需要一个cost function,这里是

 其中 

要使这个cost function最小,我们通常的方法就是对其求导,令其为零

/frac{/partial{/epsilon}}{/partial{u_x}}=/Sigma(I_x^2u_x+u_2I_xI_y+I_xI_t)=0///frac{/partial{/epsilon}}{/partial{u_x}}=/Sigma(I_y^2u_x+u_1I_xI_y+I_yI_t)=0
=>
/begin{pmatrix}/Sigma{I_x}^2&/Sigma{I_xI_y}///Sigma{I_xI_y}&/Sigma{I_y}^2/end{pmatrix}/begin{pmatrix}u_x//u_y/end{pmatrix}+/begin{pmatrix}/Sigma{I_xI_t}///Sigma{I_yI_t}=0/end{pmatrix}M=/begin{pmatrix}/Sigma{I_x}^2&/Sigma{I_xI_y}///Sigma{I_xI_y}&/Sigma{I_y}^2/end{pmatrix},/vec{b}=/begin{pmatrix}/Sigma{I_xI_t}///Sigma{I_yI_t}=0/end{pmatrix}

如果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:
     M=/Sigma_{x=p_x-w_x}^{p_x+w_x}/Sigma_{y=p_y-w_y}^{p_y+w_y}/begin{pmatrix}{I_x(x,y)}^2&I_x(x,y)I_y(x,y)//I_x(x,y)I_y(x,y)&{I_y(x,y)}^2/end{pmatrix}
    计算矩阵b:
     M=/Sigma_{x=p_x-w_x}^{p_x+w_x}/Sigma_{y=p_y-w_y}^{p_y+w_y}/begin{pmatrix}I_t(x,y)I_x(x,y)//I_t(x,y)I_y(x,y)/end{pmatrix}

   /*判断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---

你可能感兴趣的:(function,UP,features)