本打算学习 orb -slam3 源码,但还是先把《slam 14》上的代码看完再说,至少把整个流程走一遍。
https://blog.csdn.net/weixin_44684139/article/details/105305564
https://blog.csdn.net/qq_35590091/article/details/97111744
按照书上的内容,把代码分为一下几个类别
首先要知道他的目的是:一共有5步,求这5步拍摄的位置和方向(也就是求每一步的变换矩阵)。
方法:只依据当前和前一帧的信息计算变换矩阵。
步骤:(不包括异常处理等步骤)
步骤 | 函数 |
---|---|
提取关键点 | extractKeyPoints |
特征匹配 | featureMatching |
计算位姿 | poseEstimationPnP |
得出第二针图像中某些点的3D位置,为下次pnp准备 | setRef3DPoints |
将第二针插入map的数组中 | addkeyframe |
大概的变换只在上述第四步: 以前是和前辈比较,现在是和人才库(局部地图)比较。
变化的目的是:维护一个局部地图。(这个版本好像没有全局地图的概念)
那显而易见,如果想要维护局部地图那就必须要有:
删除比较容易,如何添加地图点呢?这个回答不错:
optimizeMap()这个函数实现了添加新点(嵌套着addMapPoints())。向地图中增加关键点的机制是:当前帧的关键点一旦和地图点匹配上了,那么就无视他。没有匹配上的关键点需要映射到世界坐标系中,增加局部地图点的规模。具体看函数:void Map_VisualOdometry::addMapPoints()
问题1 但这里什么叫匹配上了?什么叫没有匹配上呢?其实就是特征匹配,以前是两张图匹配,现在是 图-地图 模式。匹配好的点放在 match_3dpts_,match_2dkp_index_。具体加入三维地图点的机制:
问题2 这个 addkeyframe 关键帧是指什么?即只要旋转或者平移超过一定距离就可以被认为是关键。
问题3 既然局部地图都有了,关键帧用来做什么的?这个时候又没有回环检测!这个我也没看到有什么大用处…
学习这个主要是为了orbslam的学习铺垫,不然看天书了。