策略汇总(十一种特征匹配策略)
-
SearchForInitialization
-
SearchByProjection->4种
-
SearchByBow->2种
-
SearchForTriangulation
-
Fuse->2种
-
SearchBySim3
1.SearchForInitialization
调用函数:Tracking->MonocularInitialization
策略步骤:寻找ORB匹配点,利用匹配点对地图进行初始化,假设一张1920*1080图像,每个格子30*22.5
要点:
- 匹配点要大于100个才能进行初始化
- 挑选出来的特征点所属的金字塔必须为第0层
- 剔除那些在所选格子内但是不属于搜索范围内的点
- 最优距离要小于50,计算最优距离和次优距离的比值
- 统计匹配点的方向直方图
- 统计出特征点数量最多的方向
- 判断第二多的数量<0.1*第一多的数量?符合则证明第一多的为主方向
- 判断第三多的数量<0.1*第二多的数量?符合则证明第一和第二多的为主方向
2.SearchByProjection
调用函数:Tracking->TrackWithModel
策略步骤:根据匀速模型计算初始位姿,然后通过投影的方式搜索匹配点
- 遍历前一帧所有的特征点
- 将前一帧特征点对应的地图点投影到当前帧,在一定范围内搜索匹配点
- 将搜到的特征点和前一帧特征点逐一计算描述子距离
- 找出汉明距离最小的特征点
- 如果小于阈值,则为匹配点,跟踪成功
- 如果匹配点不足,提高阈值
- PoseOptimization,内点大于10则跟踪成功
调用函数:Tracking->Relocalization
策略步骤:前面利用EPnP计算位姿然后进行motion-only BA,如果内点不足则通过投影方式搜索更多匹配点
- 前面EPnP得到的内点不再进行搜索
- 这里需要估计关键帧地图点在当前帧图像金字塔中的层数(通过地图点离相机光心的距离计算)
- 和前面的SearchByProjection类似,将关键帧地图点投影到当前帧,然后在一定范围内进行搜索
调用函数:Tracking->TracklocalMap->SearchLocalPoints
策略步骤:搜索局部地图点,不包含前面三个步骤匹配过的地图点
- 先对局部地图点检查其是否在当前帧的视锥中,并预测金字塔层数
- 根据投影搜索匹配点,将符合要求的地图点归为该特征点的地图点
- 根据更新后的地图点再对当前帧位姿进行优化
- 如果内点足够多,跟踪线程跟踪成功
3.SearchByBow
调用函数:Tracking->TrackRefenceKeyFrame/Relocalization
策略步骤:在不知位姿的情况下通过特征向量寻找匹配点
- 提取关键帧中的特征向量(继承map<unsigned int,vector<unsigned int>>)
- 对相同节点的特征点一一计算描述子距离
- 挑选汉明距离最小的匹配对
- 判断最小距离和次小距离的比例,并检查旋转方向
- 得到两个当前帧和关键帧的匹配点
- Relocalization利用匹配点通过EPnP计算位姿,TrackRefenceKeyFrame将上一帧的位姿作为初始位姿在利用匹配点优化位姿
4.SearchForTriangulation
调用函数:Tracking->Run->CreateNewMapPoints
策略步骤:对跟踪线程中没有跟踪到的特征点在参考关键帧中搜索匹配点,进行三角测量
- 选取与当前关键帧共视程度最高的20帧相对帧
- 计算当前帧到相邻帧的R和t,并计算F矩阵
- 类似SearchByBow,对两帧之间同一节点的特征寻找匹配
- 计算匹配点离极线的距离,匹配后检查匹配点的视差
- 利用DLT进行三角测量得到3D地图点,检查深度、重投影误差、尺度连续性
5.Fuse
调用函数:LocalMapping->Run->SearchInNeighbors
策略步骤:要处理最后一个关键帧时,对之前产生的重复地图点进行融合
- 选取与当前关键帧共视程度最高的20帧一级相邻和5帧对应的二级相对帧
- 和SearchByProjection