ORB-SLAM策略思考之ORB特征点匹配策略
1 跟踪线程中使用的匹配
- 地图初始化阶段:不使用金字塔层级进行尺度缩放,直接在原图上进行匹配,进行第一帧和第二帧之间的匹配,使用窗口的方式,实现2D到2D的匹配,使用限定窗口的方式加速匹配。
- 恒速模型跟踪阶段:
- 优化位姿前获取匹配:这里会粗略的假设当前帧和上一帧之间的位姿差满足恒速约束,因此在进行这种匹配方式的时,会进行3D点到2D点的匹配,但是这里同样存在2D的特征点信息,因此使用3D重投影到当前帧后,还是使用2D的描述子进行距离计算,在这里3D点只起到了金字塔层级预测和匹配筛选的目的,这里用到的是重投影匹配的思想。
- 优化位姿后增加匹配:优化位姿后,这里并没有使用匹配的方式去增加匹配数目,原因可能在于,在获取匹配的过程中,使用的就是基于重投影匹配的思想,而且调整了一个比较大的搜索阈值,因此这里并没有必要再次通过重投影匹配的手段去增加匹配点
- 根据上一帧跟踪阶段:
- 优化位姿前获取匹配:这里使用和地图初始化阶段相似的匹配获取方式,只不过,这里使用了金字塔层级来提前筛选掉一些匹配,其本质是通过限定窗口和限定金字塔层级的方式进行匹配点的获取。
- 优化位姿后增加匹配:在位姿优化后,这里有一个相对精确的当前帧位姿信息,可以使用当前帧位姿信息进行重投影匹配,来增加匹配的数目。
- 重定位阶段:值得注意的是,在重定位阶段,是没有先验信息的,即不会有3D-2D的匹配信息
- 优化位姿前获取匹配:由于没有先验信息,因此使用词袋匹配的方式来加速特征点匹配,利用词袋进行当前帧的关键点到单词的转换,利用相同单词来减少匹配范围,使用2D-2D描述子距离,来获取最佳匹配。
- 优化位姿后增加匹配:当位姿优化后,使用重投影匹配来增加匹配数目。
- 跟踪局部地图阶段:
- 优化位姿前新增匹配:这里,将当前帧产生共视的关键帧都拿出来,再将这些关键帧的最优共视拿出来,将这些关键帧对应的匹配地图点作为局部地图点。使用3D-2D投影匹配的方式进行匹配新增,注意这里不会改变当前帧原有的匹配,并且这里计算描述子距离的时候使用的是3D地图点的描述子,而不是2D特征点。原因可能是,由于当前特征点可能对应了许多关键帧,而不同的关键帧之间又有不同的2D描述子信息,因此这里使用的是地图点的描述子信息。
2 局部建图线程中使用的匹配
- 新增地图点阶段:
- 优化位姿前增加匹配:将当前关键帧产生最优共视的20个关键帧拿出来,使用词袋匹配和极线约束的方式新增匹配信息。
- 使用基础矩阵和当前帧的特征点,可以获得在匹配关键帧上的极线信息,通过匹配关键点到极限距离和一自由度自由度卡方检验来对词袋匹配成功的点进行卡方检验的约束。
- 在相邻关键帧中寻找新匹配:
- 将与当前关键帧产生一阶最优共视的20个关键帧和与这20个关键帧产生最优共视的5个关键帧拿出来,将当前关键帧匹配地图点使用投影匹配的方式,投影到拿出来的关键帧中去,将旧的匹配进行替换,如果没有旧的匹配,则新增
- 将当拿出来的关键帧所对应的地图点信息,使用投影匹配的方式添加到当前关键帧中,将旧的匹配进行替换,如果没有旧匹配,则新增
3 回环闭合线程中使用的匹配
- 计算SIM3阶段:
- 基于词袋匹配的方式,来进一步筛选闭环候选关键帧:使用词袋匹配进行当前关键帧和闭环候选关键帧之间的匹配,以匹配成功的数目作为筛选指标,对闭环候选关键帧进行进一步的筛选,将符合条件的闭环候选关键帧分配SIM3求解器分配。
- 基于SIM3矩阵投影匹配,新增优化SIM3矩阵前的匹配:在使用基于RANSAC算法的SIM3求解器求解初始的SIM3矩阵时,使用求解出的SIM3矩阵进行投影匹配,这种基于SIM3的投影匹配和基于SE3的投影匹配是有一些不同之处的:基于SE3的匹配,只需要将待匹配的点投影到匹配帧的像素坐标系中,之后直接进行判断即可,但是基于SIM3的投影匹配,会进行两次投影,只有当匹配同时满足这两次投影,才认为这次匹配是成功的,有效的。
- 基于SIM3矩阵投影匹配,新增当前帧和与闭环匹配帧相连关键帧的匹配:拿出与闭环匹配关键帧相连的关键帧对应的地图点,将这些地图点,使用SIM3矩阵,投影到当前关键帧中去,寻找还未匹配的2D特征点,以此来产生新的匹配,并且以新增后的地图点匹配数目作为是否成功计算了SIM3矩阵。
- 闭环矫正阶段:
- 矫正与当前关键帧一阶相连的关键帧后,使用SIM3矩阵投影匹配进行地图点的替换或新增:将与当前关键帧一阶相连的关键帧的位姿信息进行校正后,将计算SIM3阶段中拿出的地图点投影到与当前关键帧一阶相连的关键帧中,替换或新增匹配。值得注意的是,这里使用的是地图点的描述子信息和2D特征点的描述子信息做的匹配。