|
上一篇主要是介绍了光流的基本概念,希望大家对于光流是什么,有什么用能有一些体会,这回要给各位介绍的是一种经典的光流求解方法:Lucas-Kanade法,本篇的脉络如下: 首先简单回顾一下始解篇中的内容,然后进行Lucas-Kanade公式的推导,谈谈我的理解,最后给出伪代码加深大家对此方法的印象.
(1) 这里的即是我们要求的光流,不过麻烦的是这里有两个未知数(u_x,u_y)但是却只有一个方程,所以我们无法求解,需要想办法再加入一个约束条件(即方程),好了,现在你是否有点体会,其实这些方法都不过是在想法加方程然后联立求解罢了,那,这一篇的角儿Lucas-kanade光流法又是如何加入约束从而求得光流的呢? 2. Lucas-Kanade光流法 转换成矩阵表示: 好拉,看起来很瑰伟,m个方程2个未知数,爱怎么求怎么求,感觉都浪费了这么些资源,但这样的推导是对的吗?请各位稍加考虑一下. (2) 上式中画箭头的三项是未知的,因为u变成估计值,所以式子中也应该是对的估计,表示成, 另外由光度不变(这个条件始终不变)得知 其中 而 (3)其中为估计误差. 由方程(2)(3),可知光流约束方程变成 (4) 得到新的光流约束方程(4)后,我们来重新分析,假设选择的窗口有m个像素点,我们可以得到m个方程: 转换成矩阵表示: 然后就是应用最小二乘法拉(least-square)拉,关于这个方法我会专门写一篇文章,这里就先不赘述了。最小二乘法需要一个cost function,这里是 其中 要使这个cost function最小,我们通常的方法就是对其求导,令其为零 => 令 如果M非奇(满秩)则光流可解得 如果M奇异,即意味着又变回只有一个方程的情形了,只能求得沿光度梯度方向的光流。 3. Lucas-Kanade光流法伪代码 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 |
