1. 函数背景与目标

这个特定版本的 SearchByProjection 函数在 ORB-SLAM2 的闭环检测 (Loop Closing) 流程中被调用。

  • 调用时机:当系统检测到一个潜在的闭环(当前关键帧 pKF 与过去的某个关键帧 pLoopKF 在同一位置),并且已经成功计算出连接这两个关键帧位姿的 Sim3 变换矩阵 Scw 之后。
  • 函数目标:利用已知的 Scw 变换,为当前关键帧 pKF 中那些尚未建立地图点关联的特征点,去寻找并建立与闭环候选帧 pLoopKF 及其共视帧相关的地图点 (vpPoints) 之间的新匹配关系。其核心目的是增加闭环约束的数量和质量

2. 核心思想

利用已计算出的 Sim3 变换 Scw 作为几何先验,指导特征匹配过程,从而在两个看似分离的地图部分之间建立更多可靠的连接点。

具体来说,是将 pLoopKF 相关区域的 3D 地图点 (vpPoints),通过 Scw 变换投影到当前关键帧 pKF 的图像平面上,然后在投影点附近搜索匹配的 pKF 特征点。

3. 主要执行步骤与思想解析

a. 输入与准备 (Code Step 1 & Initialization)

  • 输入:当前关键帧 pKF,Sim3 变换 Scw,闭环候选区域的地图点 vpPointspKF 的匹配向量 vpMatched (既是输入也是输出),搜索半径阈值 th
  • 分解 Sim3:从 Scw 中提取出尺度 scw、旋转 Rcw、平移 tcw 以及 pKF 的相机光心世界坐标 Ow。这为后续的投影和检查做准备。
  • 初始化已匹配集合 spAlreadyFound:将 vpMatched 中已存在的有效匹配放入 set 中,用于快速判断某个地图点是否已在 pKF 中有匹配,避免重复处理。

b. 遍历候选地图点并尝试匹配 (Code Step 2)

vpPoints 中的每一个地图点 pMP 进行如下尝试:

  1. 过滤 (Step 2.1):
    • 跳过坏点 (pMP->isBad())。
    • 跳过在 pKF 中已经有对应匹配的 pMP (spAlreadyFound.count(pMP))。 目标是寻找新匹配。
  2. 投影与有效性检查 (Step 2.2):
    • pMP 的世界坐标 p3Dw 通过 Rcw, tcw 变换到 pKF 的相机坐标 p3Dc
    • 执行标准投影检查
      • 深度为正 (点在相机前方)。
      • 投影点 (u, v)pKF 图像边界内。
    • 执行闭环特定的鲁棒性检查
      • 尺度不变性距离检查:计算 pMPpKF 光心 Ow 的距离 dist,检查其是否在 pMP 的有效观测距离范围 (minDistance, maxDistance) 内。距离过远或过近可能导致描述子变化过大。
      • 视角检查:检查 pKFpMP 的观测角度是否过大(> 60度)。视角过大同样会导致外观变化剧烈。
      • 目的:这些额外检查是为了确保即使经过了可能的尺度漂移和较大的视角变化,匹配仍然是可靠的。
  3. 预测尺度与搜索半径
    • 根据 pMPpKF 的距离 dist,预测 pMPpKF 中应出现的金字塔层级 nPredictedLevel
    • 计算在该预测层级下的搜索半径 radius
  4. 局部候选点搜索 (Step 2.3):
    • 调用 pKF->GetFeaturesInArea(u, v, radius),在投影点 (u, v) 附近找到空间上接近的 pKF 特征点索引 vIndices
  5. 描述子匹配与最终确认 (Step 2.4):
    • 遍历 vIndices 中的候选 pKF 特征点 idx
      • 再次过滤:跳过 pKF 中已匹配的特征点 (vpMatched[idx])。
      • 严格尺度检查:要求候选点层级 kpLevel 必须与预测层级 nPredictedLevel 非常接近(通常是 nPredictedLevel-1nPredictedLevel)。
      • 计算描述子距离:计算 pMP 描述子与候选点 idx 描述子之间的汉明距离 dist
      • 寻找最佳匹配:找到距离最小 (bestDist) 的候选点 bestIdx
      • 严格阈值判断:只有当 bestDist 小于一个较低的阈值 TH_LOW 时,才认为匹配成功。这要求比普通跟踪更高的匹配置信度。
      • 存储新匹配:如果成功,更新 vpMatched[bestIdx] = pMP,并增加 nmatches

c. 返回结果 (Code Step 3)

  • 函数返回本次调用新发现并建立的匹配数量 nmatches

4. 函数意义与重要性

  • 这个函数是闭环流程的关键一步,它利用已有的 Sim3 几何关系来指导匹配,可以挖掘出比初始检测更多的可靠匹配点
  • 这些新增的匹配点对于后续的 Sim3 位姿优化地图点融合 (Map Fusion) 过程至关重要,它们提供了更强的约束,有助于精确地对齐地图、消除累积误差并修正尺度。
  • 函数中各种严格的检查(尺度不变性、视角、低描述子距离阈值、严格尺度层级检查)确保了新增匹配的高质量,这对于保持地图一致性非常重要。