SLAM中的关键帧是什么?有什么用?如何选择关键帧?

关键帧目前是一种非常常用的方法,可以减少待优化的帧数,并且可以代表其附近的帧。可以理解为一个学校里有100个班级,每个班的班长就是一个关键帧,他可以代表他班里的人,那么如何选取关键帧呢?

选取的指标主要有:

(1)距离上一关键帧的帧数是否足够多(时间)。比如我每隔固定帧数选择一个关键帧,这样编程简单但效果不好。比如运动很慢的时候,就会选择大量相似的关键帧,冗余,运动快的时候又丢失了很多重要的帧。

(2)距离最近关键帧的距离是否足够远(空间)/运动

比如相邻帧我根据pose计算运动的相对大小,可以是位移也可以是旋转或者两个都考虑,运动足够大(超过一定阈值)就新建一个关键帧,这种方法比第一种好。但问题是如果对着同一个物体来回扫就会出现大量相似关键帧。

(3)跟踪质量(主要根据跟踪过程中搜索到的点数和搜索的点数比例)/共视特征点

这种方法就是记录当前视角下的特征点数,或者视角,当相机离开当前场景时才会新建关键帧,避免了第2种方法的问题。缺点是比较复杂。

打个比方,关键帧相当于slam的骨架,是在局部一系列普通帧中选出一帧作为局部帧的代表,记录局部信息。举例来说,摄像头放在原处不动,普通帧还是要记录的,但关键帧因为总看到原场景,所以不会增加。
三角化需要一定程度的共视区域,所以普通帧每2帧之间会存在大量的信息冗余,如果所有帧全部参与计算,不仅浪费了算力,对内存也是极大的考验,这一点在前端vo递归处理方式中表现不明显,但在后端优化里是一个大问题,所以关键帧主要作用是面向后端优化的算力与精度的折中。此外,关键帧选择时还会对图片质量、特征点质量等进行考察,一定程度上也发挥了滤波的作用,防止无用的或错误的信息进入优化过程而破坏定位建图的准确性。
选择关键帧主要从关键帧自身和关键帧与其他关键帧的关系2方面来考虑。一方面,关键帧自身质量要好,例如不能是非常模糊的图像、特征点数量要充足、特征点分布要尽量均匀等等;另一方面,关键帧与其他关键帧之间的关系,需要和局部地图中的其他关键帧有少量的共视关系,但大部分特征点是新特征点,以达到既存在约束,又尽量少的信息冗余的效果,例如局部地图点投影到此帧的点数低于一个阈值或前一个关键帧的特征点在此帧里已经有90%观测不到等等。
在关键帧的运用上,orbslam做的非常好,尤其是在回环检测中使用了以关键帧为代表的帧“簇”的概念,回环筛选中有一步将关键帧前后10帧为一组,计算组内总分,以最高分的组的0.75为阈值,滤除一些组,再在剩下的组内各自找最高分的一帧作为备选帧,这个方法非常好地诠释了“关键帧代表局部”的这个理念。

转自https://www.cnblogs.com/CV-life/p/11159820.html

posted @ 2019-08-13 10:26  Lee先森的博客  阅读(6222)  评论(0编辑  收藏  举报