金字塔LKT实现
问题描述
估计一个速度,找到对应的特征位置v=u+d=[ux+dxuy+dy]T。
ϵ(d)=ϵ(dx,dy)=x=ux−ωx∑ux+ωxy=uy−ωy∑uy+ωy(I(x,y)−J(x+dx,y+dy))2(1)
跟踪算法
两个关键指标是准确性和鲁棒性。准确性要求积分窗口要尽可能的小,而为了应对大运动,需要大的积分窗口。patch太大了会平滑图像中的细节,对于遇到以不同速度运动的两个物体就会失效。小的patch会遇到孔径问题,只能看到一个边缘没法确定整个物体的移动。patch内的点假设是具有相同运动模式,如果太大会违反相关像素的想干运动,不能很好的跟踪,一般3×3, 5×5, 7×7。
图像金字塔
相邻层之间的变换关系为
IL(x,y)=41IL−1(2x,2y)+81(IL−1(2x−1,2y)+IL−1(2x+1,2y)+IL−1(2x,2y−1)+IL−1(2x,2y+1))+161(IL−1(2x−1,2y−1)+IL−1(2x+1,2y+1)+IL−1(2x−1,2y+1)+IL−1(2x+1,2y+1))(2)
并且使用边缘的像素进行填充,以便进行插值。一般来说,金字塔4层以上就没有太大意义了。公式(2)使用了[1/41/21/4]×[1/41/21/4]T进行滤波。实际上会使用更大的核来进行滤波[1/161/43/81/41/16]×[1161/43/81/41/16]T。
金字塔特征跟踪
上一层的结果作为初值,来进行当前层的优化
ϵL(dL)=ϵL(dxL,dyL)=x=uxL−ωx∑uxL+ωxy=uyL−ωy∑uyL+ωy(IL(x,y)−JL(x+gxL+dxL,y+gyL+dyL))2(3)
总的位移增量是:
d=L=0∑Lm2LdL(4)
由于要保证d是小量,由于金字塔的使用,可以获得的增益倍数是d max final =(2Lm+1−1)d max
迭代光流计算
求解过程就是使用最小二乘,其中G矩阵可逆,等价于图像在该点的xy两个方向都具有足够的梯度信息。
一般5次迭代就可以收敛。
总结整个步骤:

亚像素计算
亚像素精度是由于双线性插值带来的
边缘部分特征
如果忽略边缘的特征,那么被忽略的范围有2LMωx,因此计算边缘部分的点时,就要重新计算一遍Hessian和residual。
跟丢判别
第二点很难判别,使用固定的阈值并不可行。如果每次跟踪的参考帧都是上一帧,会发生明显的drift,一种解决办法就是使用固定的第一帧作为参考,这样更具有意义。(SVO就是这样做的)
可以使用仿射跟踪模型,但是在本文方法比它效果要好,因此不是必要的。因为仿射变换增加了参数到6个。
特征选择
- 计算每个像素的G矩阵的最小特征值λm ,DSO使用Ix2+Iy2
- 取整个图像中λm的最大值λmax
- 取$\lambda_m 大于\lambda_{max}$的百分比(10% or 5%)的像素
- 对于留下的像素,取局部最大值。即在3×3的邻域内,这个像素的$\lambda_m $大于周围的像素。
- 保留和任意像素之间的距离都大于阈值(10 or 5)的像素
选取的数目依据计算能力,选点使用3×3的邻域足够了,但跟踪往往使用5,7,9,11….