• 稀疏光流特征点跟踪(KLT)


    稀疏光流原理

    光流(optical flow)是空间运动物体在观测成像面上的像素运动的瞬时速度。物体在运动的时候,它在图像上对应点的亮度模式也在做相应的运动,这种图像亮度模式的表观运动就是光流。它的基本假设是体素和图像像素守恒,即一个物体的颜色在前后两帧没有巨大而明显的变化。不同的光流算法解决了假定了不同附加条件的光流问题。根据所形成的光流场中二维矢量的疏密程度可以分为稠密光流与稀疏光流两种。

    稠密光流是一种针对图像或指定的某一片区域进行逐点匹配的图像配准方法,它计算图像上所有的点的偏移量,从而形成一个稠密的光流场。通过这个稠密的光流场,可以进行像素级别的图像配准。

    稀疏光流并不对图像的每个像素点进行逐点计算。它通常需要指定一组点进行跟踪,这组点最好具有某种明显的特性,例如Harris角点等,那么跟踪就会相对稳定和可靠。稀疏跟踪的计算开销比稠密跟踪小得多,计算更便捷,其建立在下面三个假设上:

    1. 亮度恒定。(I(x, y, t-1) = I(x+u(x,y), y+v(x,y), t)),即运动物体在图片上的灰度值在很短的时间内不会改变;

    2. 时间连续或者是运动是“小运动”;

    3. 空间一致,临近点有相似运动,保持相邻,即同一个窗口中的点偏移量都相等。

    (I(x, y , t-1) approx I(x, y, t) + I_x u(x,y)+I_y (x, y))做一阶泰勒展开,得到

    [egin{align*}​ 0 approx abla I_t + abla I_x cdot u(x, y) + abla I_y cdot v(x, y)end{align*} ]

    上式中存在两个变量(u(x, y))(v(x, y)),再利用假设三,即空间一致性,如果选择的窗口大小是5,那么就可以得到25个等式,即

    [egin{align*} egin{bmatrix} I_x(P_1) & I_y(P_1)\ I_x(P_1) & I_y(P_1)\ vdots & vdots \ I_x(P_25) & I_y(P_25)\ end{bmatrix} egin{bmatrix} u \ v end{bmatrix} = - egin{bmatrix} I_t(P_1) \ I_t(P_2) \ vdots \ I_t(P_25) \ end{bmatrix}end{align*} ]

    [egin{align*} A &= egin{bmatrix} I_x(P_1) & I_y(P_1)\ I_x(P_1) & I_y(P_1)\ vdots & vdots \ I_x(P_25) & I_y(P_25)\ end{bmatrix}end{align*} ]

    [egin{align*} d &= egin{bmatrix} u \ v end{bmatrix}end{align*} ]

    [egin{align*} b &= egin{bmatrix} I_t(P_1) \ I_t(P_2) \ vdots \ I_t(P_25) \ end{bmatrix}.end{align*} ]

    可以看出,上述问题是一个最小二乘问题(Ad = b),即(A^TAd = A^Tb)。当(A^T A)可逆式,且不稀疏,(A^T A)的条件数比较合适时求解速度更快。

    [egin{align*} A^T A &= egin{bmatrix} sum I_x I_x & sum I_x I_y \ sum I_y I_x & sum I_yI_y end{bmatrix}\ &= sum abla I ( abla I)^Tend{align*} ]

    (A^T A)的特征根和特征值与边的方向和幅度有关,当(A^T A)两个特征值都比较大时,说明该点在(x)(y)方向上变换都比较大,更可能是角点;当两个特征值都比较小时,说明该点更可能在“平滑”的区域。因此只有当该点是角点的时候,上述方程才能解。

    Lucas-Kanade flow

    Lucas-Kanade flow极小化下面式子得到((u,v))

    [egin{align*} E(u, v) &= sum_{(x, y) in W} w(x, y) (I_x(x, y)cdot u + I_x(x, y)cdot v + I(x, y, t) - I(x, y , t-1))^2\ & = egin{bmatrix} u & v& 1end{bmatrix} M egin{bmatrix} u \ v \ 1 end{bmatrix}end{align*} ]

    其中

    [egin{align*} M & = sum_{(x, y) in W} w(x, y) egin{bmatrix} I_x^2 & I_x I_y & I_xI_t \ I_xI_y & I_y^2 & I_yI_t \ I_xI_x & I_t I_y & I_t^2 \end{bmatrix}end{align*} ]

    其中的权重(w)一般使用高斯核,则通过(frac{partial E(u, v)}{partial (u, v)}=0)可以得到

    [egin{align*}G_{sigma} ast egin{bmatrix} I_x^2 & I_x I_y \ I_xI_y & I_y^2 end{bmatrix} egin{bmatrix} u \ v end{bmatrix} = -G_{sigma} ast egin{bmatrix} sum w(x, y)I_xI_t \ sum w(x, y)I_yI_t end{bmatrix}end{align*} ]

    光流法用于目标跟踪的原理为:

    1. 针对每一个视频序列,利用一定的目标检测方法,检测可能出现的前景目标

    2. 如果某一帧出现了前景目标,找到其具有代表性的关键特征点(可以随机 产生,也可以利用角点来做特征点)

    3. 对之后的任意两个相邻视频帧而言,寻找上一帧中出现的关键特征点在当 前帧中的最佳位置,从而得到前景目标在当前帧中的位置坐标

    4. 如此迭代进行,便可实现目标的跟踪

    Lucas-Kanade光流法可能会面临下述问题:

    1. 物体运动幅度较大,大于一个像素。解决方法是Iterative refinement,coarse-to-fine estimation;

    2. 像素点和它周围点的运动不相似,可以通过动作分割来解决;

    3. 违背亮度值一致假设。

    多尺度迭代光流估计

    上面说到当物体运动超过一个像素时,Lucas-Kanade光流法可能会遇到问题。时间混淆就是一个例子,

    Temporal aliasing

    图像有多个亮度点匹配,如果选择临近点则会对动作造成错误估计。多尺度能解决这个问题。首先,对每一帧建立一个高斯金字塔,最大尺度图片在最顶层,原始图片在底层。然后,从顶层开始估计下一帧所在位置,作为下一层的初始位置,沿着金字塔向下搜索,重复估计动作,直到到达金字塔的底层。其算法流程如下:

    Iprip.png

    Ip5c0.png

    参考资料

    1. _木头人, Lucas–Kanade光流算法学习
    2. Moondark, Kanade-Lucas-Tomasi(KLT)进行目标跟踪
  • 相关阅读:
    Outdated Kotlin Runtime
    安装 intelliJ idea 。 快速学会kotlin
    配置lambda
    kotlin 安装 使用
    android stuidio 导入项目问题。
    下载 ....aar jitpack.io 打不开。
    android studio 汉化包 美化包
    安卓架构 视频
    剑指offer-把二叉树打印成多行
    剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
  • 原文地址:https://www.cnblogs.com/DemonHunter/p/12914034.html
Copyright © 2020-2023  润新知