金字塔LKT实现

问题描述

估计一个速度,找到对应的特征位置v=u+d=[ux+dxuy+dy]T\mathbf{v}=\mathbf{u}+\mathbf{d}=\left[u_{x}+d_{x} \quad u_{y}+d_{y}\right]^{T}
ϵ(d)=ϵ(dx,dy)=x=uxωxux+ωxy=uyωyuy+ωy(I(x,y)J(x+dx,y+dy))2(1) \epsilon(\mathbf{d})=\epsilon\left(d_{x}, d_{y}\right)=\sum_{x=u_{x}-\omega_{x}}^{u_{x}+\omega_{x}} \sum_{y=u_{y}-\omega_{y}}^{u_{y}+\omega_{y}}\left(I(x, y)-J\left(x+d_{x}, y+d_{y}\right)\right)^{2} \tag{1}

跟踪算法

两个关键指标是准确性和鲁棒性。准确性要求积分窗口要尽可能的小,而为了应对大运动,需要大的积分窗口。patch太大了会平滑图像中的细节,对于遇到以不同速度运动的两个物体就会失效。小的patch会遇到孔径问题,只能看到一个边缘没法确定整个物体的移动。patch内的点假设是具有相同运动模式,如果太大会违反相关像素的想干运动,不能很好的跟踪,一般3×3, 5×5, 7×7。

图像金字塔

相邻层之间的变换关系为
IL(x,y)=14IL1(2x,2y)+18(IL1(2x1,2y)+IL1(2x+1,2y)+IL1(2x,2y1)+IL1(2x,2y+1))+116(IL1(2x1,2y1)+IL1(2x+1,2y+1)+IL1(2x1,2y+1)+IL1(2x+1,2y+1))(2) \begin{aligned} I^{L}(x, y)= & \frac{1}{4} I^{L-1}(2 x, 2 y)+\\ & \frac{1}{8}\left(I^{L-1}(2 x-1,2 y)+I^{L-1}(2 x+1,2 y)+I^{L-1}(2 x, 2 y-1)+I^{L-1}(2 x, 2 y+1)\right)+\\ & \frac{1}{16}\left(I^{L-1}(2 x-1,2 y-1)+I^{L-1}(2 x+1,2 y+1)+I^{L-1}(2 x-1,2 y+1)+I^{L-1}(2 x+1,2 y+1)\right) \end{aligned} \tag{2}
并且使用边缘的像素进行填充,以便进行插值。一般来说,金字塔4层以上就没有太大意义了。公式(2)使用了[1/41/21/4]×[1/41/21/4]T\left[ \begin{array}{lllll}{1 / 4} & {1 / 2} & {1 / 4}\end{array}\right] \times \left[ \begin{array}{lllll}{1 / 4} & {1 / 2} & {1 / 4}\end{array}\right]^{T}进行滤波。实际上会使用更大的核来进行滤波[1/161/43/81/41/16]×[1161/43/81/41/16]T\left[ \begin{array}{llllllllllll}{1 / 16} & {1 / 4} & {3 / 8} & {1 / 4} & {1 / 16}\end{array}\right] \times \left[ \begin{array}{lllll}{1} & {16} & {1 / 4} & {3 / 8} & {1 / 4} & {1 / 16}\end{array}\right]^{T}

金字塔特征跟踪

上一层的结果作为初值,来进行当前层的优化
ϵL(dL)=ϵL(dxL,dyL)=x=uxLωxuxL+ωxy=uyLωyuyL+ωy(IL(x,y)JL(x+gxL+dxL,y+gyL+dyL))2(3) \epsilon^{L}\left(\mathbf{d}^{L}\right)=\epsilon^{L}\left(d_{x}^{L}, d_{y}^{L}\right)=\sum_{x=u_{x}^{L}-\omega_{x}}^{u_{x}^{L}+\omega_{x}} \sum_{y=u_{y}^{L}-\omega_{y}}^{u_{y}^{L}+\omega_{y}}\left(I^{L}(x, y)-J^{L}\left(x+g_{x}^{L}+d_{x}^{L}, y+g_{y}^{L}+d_{y}^{L}\right)\right)^{2} \tag{3}
总的位移增量是:
d=L=0Lm2LdL(4) \mathbf{d}=\sum_{L=0}^{L_{m}} 2^{L} \mathbf{d}^{L} \tag{4}
由于要保证d\bf d是小量,由于金字塔的使用,可以获得的增益倍数是d max final =(2Lm+11)d max d_{\text { max final }}=\left(2^{L_{m}+1}-1\right) d_{\text { max }}

迭代光流计算

求解过程就是使用最小二乘,其中G矩阵可逆,等价于图像在该点的xy两个方向都具有足够的梯度信息。

一般5次迭代就可以收敛。

总结整个步骤:

简单光流实现

亚像素计算

亚像素精度是由于双线性插值带来的

边缘部分特征

如果忽略边缘的特征,那么被忽略的范围有2LMωx2^{L_M}\omega_x,因此计算边缘部分的点时,就要重新计算一遍Hessian和residual。

跟丢判别

  • 点落在了图像外面
  • 由于遮挡,patch变化特别大

第二点很难判别,使用固定的阈值并不可行。如果每次跟踪的参考帧都是上一帧,会发生明显的drift,一种解决办法就是使用固定的第一帧作为参考,这样更具有意义。(SVO就是这样做的)

可以使用仿射跟踪模型,但是在本文方法比它效果要好,因此不是必要的。因为仿射变换增加了参数到6个。

特征选择

  1. 计算每个像素的GG矩阵的最小特征值λm\lambda_m ,DSO使用Ix2+Iy2I_x^2+I_y^2
  2. 取整个图像中λm\lambda_m的最大值λmax\lambda_{max}
  3. 取$\lambda_m 大于\lambda_{max}$的百分比(10% or 5%)的像素
  4. 对于留下的像素,取局部最大值。即在3×33\times3的邻域内,这个像素的$\lambda_m $大于周围的像素。
  5. 保留和任意像素之间的距离都大于阈值(10 or 5)的像素

选取的数目依据计算能力,选点使用3×33\times 3的邻域足够了,但跟踪往往使用5,7,9,11….

相关文章:

  • 2021-07-02
  • 2022-12-23
  • 2021-09-10
  • 2022-01-13
  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-30
  • 2022-12-23
  • 2021-11-30
  • 2021-07-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案