Frame::GetFeaturesInArea 函数

1. 函数目标

该函数的核心目的是在给定的图像帧 (Frame) 中,高效地查找满足以下条件的特征点:

  1. 位于以指定点 (x, y) 为圆心、r 为半径的圆形区域内。
  2. 其所在的图像金字塔层级 (octave) 在指定的 [minLevel, maxLevel] 范围内(可选)。

这在特征匹配、局部地图跟踪等场景中非常常用,需要在某个预期位置附近搜索对应的特征点。

2. 面临的挑战与常规思路

如果图像中有大量特征点(例如上千个),最直观的方法是:

  • 遍历当前帧中的所有特征点。
  • 每一个特征点,计算它到圆心 (x, y) 的距离。
  • 判断距离是否小于 r,并且层级是否符合要求。

缺点: 计算量巨大,需要对所有点进行距离计算,对于实时性要求高的 SLAM 系统来说效率太低。

3. ORB-SLAM2 的优化策略:网格化加速 (Grid-based Acceleration)

为了解决效率问题,ORB-SLAM2 采用了空间划分的思想,具体为网格化

  • 预处理:在提取特征点后,系统会根据每个特征点的坐标,将其分配到预先划分好的二维网格 (mGrid) 中。每个网格单元存储落入其中的特征点的索引列表。
  • GetFeaturesInArea 的执行逻辑
    1. 确定相关网格 (Coarse Filtering)
      • 根据输入的圆心 (x, y) 和半径 r,计算出这个圆形区域可能覆盖到的网格单元的最小/最大行号和列号 (nMinCellXnMaxCellX, nMinCellYnMaxCellY)。
      • 目的:快速确定一个包含搜索圆的矩形网格区域,将搜索范围从整个图像缩小到少数几个网格单元。
    2. 遍历候选特征点
      • 遍历上一步确定的相关网格单元。
      • 获取这些网格单元中包含的所有特征点索引。这些点是“候选点”。
      • 目的:大大减少需要进一步检查的特征点数量。
    3. 精确筛选 (Fine Filtering)
      • 每一个候选点执行精确检查:
        • 层级检查kpUn.octave 是否在 [minLevel, maxLevel] 之间。
        • 距离检查:计算该点到圆心 (x, y)精确距离,判断是否 < r (通常用距离平方 < r*r 来避免开方运算)。
      • 目的:从候选点中精确找出真正符合圆形区域和层级要求的点。
    4. 返回结果:收集所有通过精确筛选的特征点的索引。

4. 核心思想总结:为何需要“网格+距离判断”?

  • 网格是矩形的,搜索区是圆形的:网格能快速定位到包含搜索圆的矩形区域内的候选点,但这个矩形区域比圆形区域要大。
  • 网格提供粗筛:它能高效排除大量无关的点,提供一个较小的候选集
  • 距离判断提供精筛:对于网格筛选出的候选点,必须进行精确的距离计算,才能判断它们是否真正位于圆形区域内部,排除那些在矩形网格内但在圆形区域外的点。

结论: GetFeaturesInArea 通过网格进行快速粗筛,然后对少量候选点进行精确的距离和层级判断,实现了在保证准确性的前提下,大幅提升邻域特征点搜索效率的目标。这是一种典型的空间换时间优化策略。