ORB-SLAM3关键帧选取策略

前言
ORB-SLAM3使用关键帧来策略来进行跟踪建图,所以本文介绍关键帧的选取策略

一、什么是关键帧?
关键帧是目前是一种非常常用的方法,可以减少待优化的帧数,并且可以代表其附近的帧,关键帧相当于slam的骨架,是在局部一系列普通帧中选出一帧作为局部帧的代表,记录局部信息。如果摄像头放在原处不动,普通帧还是要记录的,但关键帧因为总看到原场景,所以不会增加。

可以简单理解为方阵里有10行10列,每一行的第一个人就是一个关键帧,他可以代表他所在一行的人的特征。但实际上并不是每一行第一个人,这就涉及到关键帧的选取策略了。

二、选取策略
本人结合源码及网上其他大佬的文章总结如下:

首先是三个不插入关键帧的判定(判定成功,直接返回false,不插入关键帧)

处于定位模式:不插入关键帧
理由:定位模式是只定位不建图,只利用已有的地图点对当前相机姿态进行估计,而不更新地图点,因此没有插入关键帧的必要。
局部地图被回环线程占用:不插入关键帧
理由:局部地图被占用,插入关键帧会影响全局闭环的优化。
[关键帧数量>mMaxFrames]且[重定位后还没有过mMaxFrames个帧]:不插入关键帧
解释: 关键帧数量够多且刚刚重定位,这是系统比较稳定,不用插入。mMaxFrames是源码中预设的最大值。
经过这三个判断后没有返回不插入,就继续判定下面的条件(三选一满足即可):

c1a: 距上次插入关键帧后经过mMaxFrames帧,MAX是ORBSLAM2预设的最大值;
原因:防止过去太多帧,丢失太多信息导致跟踪丢失。
c1b: [距上次插入关键帧后经过mMinFrames个帧]&&[局部建图空闲]
原因:防止图像重叠度太高,并且局部建图线程有空闲处理新的关键帧,mMinFrames是源码预设的最小值。
c1c: 非单目&&[mnMatchesInliers<nRefMatches*0.25 || bNeedToInsertClose ]
原因: 当前跟踪内点数少,跟踪丢失点较多,该插入关键帧,否则容易跟丢。
然后是必须满足的条件:
c2 : [mnMatchesInliers<nRefMatches*thRefRatio|| bNeedToInsertClose]&&[ mnMatchesInliers>15]
解释:内点数必须超过设定的最小阈值,并且重叠度不能太大,保证关键帧跟踪的质量,同时,避免引入过多的信息冗余。

ORB-SLAM3添加了IMU模块,因此相比ORB-SLAM2多了两个IMU判定条件:
c3 : 单目/双目IMU 当前帧距离上一次添加关键帧过了0.5s
c4 : 单目IMU 和局部地图匹配点数在[15,75] || mState==RECENTLY_LOST (跟踪最近丢失)

判定策略:
if ((( c1a || c1b || c1c ) && c2 ) || c3 || c4 )
if 局部地图空闲,可以接受关键帧 return true;
else 非单目,地图不空闲,但关键帧等待插入队列中关键帧数<3, 也可以接受,return true;
解释:
非IMU模式,c2必须满足,c1a,b,c三个满足一个即可
IMU模式,只需要满足c3或者c4一个即可

以上只是本人的理解,如有错误,希望大佬们指教。
参考文章:
https://www.cnblogs.com/lihanwen/p/11344315.html
https://blog.csdn.net/Y_Dumpling/article/details/112256703
————————————————
版权声明:本文为CSDN博主「秋心拆两瓣」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51294589/article/details/117111204

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值