投影匹配--闭环版
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,闭环候选区域的地图点vpPoints,pKF的匹配向量vpMatched(既是输入也是输出),搜索半径阈值th。 - 分解 Sim3:从
Scw中提取出尺度scw、旋转Rcw、平移tcw以及pKF的相机光心世界坐标Ow。这为后续的投影和检查做准备。 - 初始化已匹配集合
spAlreadyFound:将vpMatched中已存在的有效匹配放入set中,用于快速判断某个地图点是否已在pKF中有匹配,避免重复处理。
b. 遍历候选地图点并尝试匹配 (Code Step 2)
对 vpPoints 中的每一个地图点 pMP 进行如下尝试:
- 过滤 (Step 2.1):
- 跳过坏点 (
pMP->isBad())。 - 跳过在
pKF中已经有对应匹配的pMP(spAlreadyFound.count(pMP))。 目标是寻找新匹配。
- 跳过坏点 (
- 投影与有效性检查 (Step 2.2):
- 将
pMP的世界坐标p3Dw通过Rcw,tcw变换到pKF的相机坐标p3Dc。 - 执行标准投影检查:
- 深度为正 (点在相机前方)。
- 投影点
(u, v)在pKF图像边界内。
- 执行闭环特定的鲁棒性检查:
- 尺度不变性距离检查:计算
pMP到pKF光心Ow的距离dist,检查其是否在pMP的有效观测距离范围 (minDistance,maxDistance) 内。距离过远或过近可能导致描述子变化过大。 - 视角检查:检查
pKF对pMP的观测角度是否过大(> 60度)。视角过大同样会导致外观变化剧烈。 - 目的:这些额外检查是为了确保即使经过了可能的尺度漂移和较大的视角变化,匹配仍然是可靠的。
- 尺度不变性距离检查:计算
- 将
- 预测尺度与搜索半径:
- 根据
pMP到pKF的距离dist,预测pMP在pKF中应出现的金字塔层级nPredictedLevel。 - 计算在该预测层级下的搜索半径
radius。
- 根据
- 局部候选点搜索 (Step 2.3):
- 调用
pKF->GetFeaturesInArea(u, v, radius),在投影点(u, v)附近找到空间上接近的pKF特征点索引vIndices。
- 调用
- 描述子匹配与最终确认 (Step 2.4):
- 遍历
vIndices中的候选pKF特征点idx:- 再次过滤:跳过
pKF中已匹配的特征点 (vpMatched[idx])。 - 严格尺度检查:要求候选点层级
kpLevel必须与预测层级nPredictedLevel非常接近(通常是nPredictedLevel-1或nPredictedLevel)。 - 计算描述子距离:计算
pMP描述子与候选点idx描述子之间的汉明距离dist。 - 寻找最佳匹配:找到距离最小 (
bestDist) 的候选点bestIdx。 - 严格阈值判断:只有当
bestDist小于一个较低的阈值TH_LOW时,才认为匹配成功。这要求比普通跟踪更高的匹配置信度。 - 存储新匹配:如果成功,更新
vpMatched[bestIdx] = pMP,并增加nmatches。
- 再次过滤:跳过
- 遍历
c. 返回结果 (Code Step 3)
- 函数返回本次调用新发现并建立的匹配数量
nmatches。
4. 函数意义与重要性
- 这个函数是闭环流程的关键一步,它利用已有的 Sim3 几何关系来指导匹配,可以挖掘出比初始检测更多的可靠匹配点。
- 这些新增的匹配点对于后续的 Sim3 位姿优化 和 地图点融合 (Map Fusion) 过程至关重要,它们提供了更强的约束,有助于精确地对齐地图、消除累积误差并修正尺度。
- 函数中各种严格的检查(尺度不变性、视角、低描述子距离阈值、严格尺度层级检查)确保了新增匹配的高质量,这对于保持地图一致性非常重要。
