Contents — find the section you need

如果特征检测是确定“图像中哪个位置用作地标”的过程,那么特征跟踪则是找到“该地标在下一帧中移动到的位置”的过程。稳定的跟踪能够帮助你估计相机运动、物体速度或机器人的自身定位。反之,如果单个对应关系出错,则可能导致后续的姿态估计和地图瞬间崩溃。本文将检测器和描述符之间的区别视为既定的,并将像素运动的局部优化和描述符匹配视为一个单一的设计问题。

0. 30 秒总结

  • 跟踪有两种方法:“在下一帧中搜索前一帧周围的区域”,以及“在每一帧中检测并计算描述符并进行匹配”。

  • Lucas-Kanade 方法假设亮度恒定、局部运动以及相邻像素共享速度,并求解一个 2×2 正规方程组。使用金字塔可以扩展该方法以处理较大的位移。

  • 描述符匹配即使在帧间距较大的情况下也能进行重新搜索,但代价是计算量更大,且匹配失败率更高。可通过比值测试、互最近邻算法和 RANSAC 算法进行几何验证。

  • 跟踪质量的评判标准不仅在于匹配点的数量,还应包括图像中的空间分布、重投影误差、前后一致性以及遮挡后的恢复率。

  • 难点包括运动模糊、低纹理、反射、动态物体、滚动快门效应以及突然的尺度变化。置信度评分和重检测机制至关重要。

1. 为什么图像上的点看起来会移动

Diagram 1 · Use the button to switch views
前后帧之间通过运动箭头连接的特征点

图 1 — 对应关系只有在其运动与相邻点和相机模型一致时才算作一个假设。空间覆盖范围与原始匹配计数同样重要。

在相机运动的情况下,三维点 X 投影到图像上的 \mathbf{x}=(x,y)。帧间隔为 \Delta t,跟踪的目标是找到 \mathbf{d}_k 在

\mathbf{x}_{k+1}=\mathbf{x}_k+\mathbf{d}_k
中的位移

当相机平移时,视速度随深度而变化;当相机旋转时,整个图像沿同一方向移动。简单地相减连续图像很容易受到光照变化和曝光噪声的影响,因此取而代之的是使用局部块结构。

2. Lucas-Kanade:一次性求解小窗口

亮度恒常性假设为

I(x,y,t)=I(x+u,y+v,t+\Delta t)

对小位移进行线性化 (u,v) 得到光流约束方程

I_xu+I_yv+I_t=0

对于单个像素,这是一个包含两个未知数的方程(孔径问题)。因此,窗口 W 内的像素被合并,并进行最小二乘法求解

\begin{bmatrix}u\\v\end{bmatrix} =-\left(\sum_{W}w\begin{bmatrix}I_x^2&I_xI_y\\I_xI_y&I_y^2\end{bmatrix}\right)^{-1} \sum_Ww\begin{bmatrix}I_xI_t\\I_yI_t\end{bmatrix}

。括号内的项是特征点的局部结构矩阵——在角点处,两个方向上的梯度越大,其可逆性就越稳定。在平坦的墙面或单个边缘上,运动无法唯一确定。

为了处理较大的位移,位移从降尺度金字塔的粗略层级向下传播到精细层级。在每个层级,都会运行多次迭代。在下一个位置重新计算。在实现过程中,您需要调整金字塔深度、窗口大小、终止条件、最小特征值以及前向和后向跟踪误差。

3. 选择此方法还是描述符匹配

像 ORB 或 SIFT 这样的描述符会将周围的图像块转换为向量或位串,并将距离最近的候选点作为对应点。对于连续帧之间的小幅运动,Lucas-Kanade 算法速度很快,但当需要从遮挡中恢复、跳帧或相机发生大幅移动时,描述符重新匹配就显得尤为重要。

方法 输入 优点 缺点 典型应用
LK 跟踪 前一帧的点和下一帧的图像 快速,亚像素精度 适用于小到大位移、遮挡和低纹理情况 VO,实时跟踪
ORB 匹配 来自两幅图像的描述符 轻量级,可处理旋转 可能出现不匹配反射/模糊 SLAM 初始化/重新搜索
SIFT 匹配 来自两幅图像的描述符 对尺度/旋转具有鲁棒性 计算量、内存占用 SfM、图像检索
基于学习 点、描述符、匹配器 对外观的大幅变化具有潜在的鲁棒性 训练数据之外、GPU 负载 困难环境、研究

仅取最近距离的描述符候选值会导致来自相似模式的不匹配。要求最近距离的 d_1 和次近距离的 d_2 之间存在 d_1/d_2\lt\tau(比率测试),并进一步检查 A→B 和 B→A 的互近邻,有助于解决这个问题。最后,使用 RANSAC 算法,通过对对应关系估计的基本矩阵、单应性矩阵或 PnP 矩阵的重投影误差进行验证。

4. 量化跟踪置信度

在实现中,仅仅将“跟踪成功”判断为仅仅记录“返回了一个点”是不够的。记录以下信息可以帮助您找出故障原因:

  • LK 最小特征值和残差

  • 前向跟踪和后向跟踪之间的差异(前向-后向误差)

  • 描述符比率和距离的分布

  • RANSAC 内点比率和重投影误差

  • 图像上点的空间分布(它们是否仅聚集在中心?)

  • 帧间平均位移、模糊度量、曝光/增益

即使 RANSAC 内点比率很高,如果所有点都聚集在图像的一个角落,姿态估计也会退化。限制每个网格单元的最大点数并将特征点分散到整个视场可以提高旋转和平移的可观测性。有时,保持少量对应点分布在不同方向和距离上比简单地增加点数更好。

5. 运动物体和卷帘快门

视觉里程计假设环境是静态的,以此来估计相机运动。当有很多行人、汽车或旋转物体时,情况就不同了。当画面中出现扇形物体时,它们的对应关系会成为与相机运动模型不一致的异常值。当动态物体过多,仅靠 RANSAC 算法无法去除时,可结合语义掩蔽、光流聚类、背景建模和深度一致性等方法。

CMOS 相机的卷帘快门会逐行(从上到下)曝光图像,每次曝光时间略有不同。在快速旋转或振动的情况下,即使在单帧图像中,相机姿态也会逐行发生变化,从而打破了单一投影模型的假设。缓解措施包括使用 IMU 角速度进行行时序校正、全局快门、缩短曝光时间以及校准读出时间。

6. 最小实现流程

  1. 使用相机内参、畸变和时间戳进行标定。

  2. 在初始帧中检测 FAST/ORB 或 Shi-Tomasi 偏差,并通过网格进行空间均衡。

  3. 在每一帧中,使用金字塔 LK 算法进行跟踪,检查前向-后向误差和图像边界。

  4. 丢弃置信度低的点,并进行检测。在网格单元中填充新点。

  5. 按必要的时间间隔运行描述符匹配,并使用 RANSAC 算法去除异常值。

  6. 将剩余的对应关系传递给 Essential Matrix、PnP 或 IMU 融合步骤。

  7. 如果点数持续丢失,则重新初始化,并记录跟踪状态和原因。

决定何时恢复跟踪

当遮挡或曝光变化暂时减少点数时,外推每个旧位置可能会将错误的对应关系变成看似稳定的跟踪。首先检查帧号、时间戳、图像边界和前向-后向误差,然后移除操作范围之外的候选点。即使点数足够多,如果所有剩余点都占据一个很小的图像区域,也是不安全的;停止姿态估计,按网格单元重新检测,并在重新拟合几何模型之前将静态背景与运动物体分离。将此过程记录为具有“跟踪”和“重新初始化”状态的状态机,可以使丢失的数据与错误的匹配区分开来。

在实现中,为每个点附加帧号和观测时间戳。对应关系确保处理延迟不会将旧点混入新帧中。当相机突然移动时,检查位移是否仍然符合最粗金字塔层级和窗口。如果不符合,切换到描述符重新搜索比扩大窗口直至收敛到其他模式更安全。重新搜索的候选点仍然必须通过极线或单应性残差检查以及前向-后向一致性检查。如果刻意跟踪移动物体,请将相机运动点和物体跟踪点保存在不同的集合中;不要将一个集合的异常值判定结果用于另一个集合。回放包含光照变化、遮挡和通信延迟的日志,以测试在这些边界处的恢复情况。

7. 结论

特征跟踪技术将检测器、局部优化、描述符匹配和几何验证视为一个单一的置信度设计问题。LK 平滑地连接连续帧,描述符可以从较大的变化中恢复,RANSAC 从几何角度筛选掉不匹配项。与其依赖其中任何单一方法,不如保留包含点分布、时间同步、动态物体等信息的日志。卷帘快门显著提高了视觉 SLAM 和 VIO 的可复现性。

检查你的理解
成功跟踪的点总是正确的匹配吗?

跟踪可能会跳到相似的模式。检查前向-后向一致性、残差和几何形状,而不仅仅是计算跟踪次数。

参考资料

在光流Lab中跟踪这些点在两帧之间的运动。

What to read next

Review the background特征点匹配实验 — 区分描述子筛选、几何内点与真值Continue the series光流 Lab:跟踪两帧之间的运动Explore another aspect of this field图像亮度 Lab — 曝光、伽马与裁剪