1. ORB特征点提取
关于ORB特征提取,在视觉SLAM十四讲第7讲进行了总结更新
关键词:关键点,描述子,ORB的全程,灰度质心法,特征金字塔中特征点数量的分配,使用四叉树均匀分布特征点,高斯处理,特征点去畸变,近点和远点
关于仿函数:
仿函数(functor)又称为函数对象(function object)是一个能行使函数功能的类。仿函数的语法几乎和我们普通的函数调用一样,不过作
为仿函数的类,都必须重载operator()运算符
1.仿函数可有拥有自己的数据成员和成员变量,这意味着这意味着仿函数拥有状态。这在一般函数中是不可能的。
2.仿函数通常比一般函数有更好的速度。
https://blog.csdn.net/jinzhu1911/article/details/101317367
2. 地图初始化
2D-2D,对极约束,回忆本质矩阵、基础矩阵、单应矩阵,秩,自由度
如何求解E、F、H,代码实现?
SVD分解,性质?最优解?SVD分解之后如何变成E或者F
对极约束后,单目情况下用三角测量恢复地图点深度。
卡方检验(需要补充) ,原理以及作用,outliers和inliers
单目SFM地图初始化,3D-2D的PnP,其中方法有DLT EPnP UPnP P3P。作者的改动是用8点法求基础矩阵之前,先对像点坐标进行归一化处理,即对原始的图像坐标做同向性变换。这样可以减少噪声的干扰,提高8点发的精度。
双目地图初始化,双目求深度原理,有深度z,d(disparity)视差,f焦距,b(baseline)基线,利用相似三角形性质,可得到比例等式。两帧图像稀疏立体匹配过程:
3. 地图点、关键帧、图结构
地图点和特征点的区别?
地图点是三维点,来自真实世界的三维物体,有唯一的id。不同帧里的特征点可能对应三维空间中同一个三维点,
特征点是二维点,是特征提取的点,大部分二维点在三维空间中没有对应地图点(因为特征点匹配后需要筛选等过程)
什么时候生成地图点?
关于生成地图点,主要有以下几个地方:
1、单目初始化时前两帧匹配生成地图点,双目左右目匹配生成地图点,RGB-D测量得到的地图点
2、local mapping里共视关键帧之间用 LocalMapping::CreateNewMapPoints() 生成地图点
3、Tracking::UpdateLastFrame() 和 Tracking::CreateNewKeyFrame() 中为双目和RGB-D生成了新的临时地图点,单目不生成
关键帧是几帧普通帧里面最具有代表性的一帧。
为什么需要关键帧?
- 降低信息冗余度。比如摄像头原处不动
- 关键帧选择会对图片质量、特征点质量进行考察,一定程度上关键帧是普通帧滤波和优化的结果。防止无用的信息进入优化过程而破坏定位建图的准确性
- 关键帧是面向后端优化的算力与精度的折中,使得有限的计算资源能够用在刀刃上,保证系统的平稳运行。
如何选择关键帧?考虑哪些方面(两个)?选取的指标主要有(3个)?
什么是共视图covisiblility graph?共视图的作用?
什么是本质图?
共视图比较稠密,本质图比共视图更稀疏,这是因为本质图的作用是用在闭环矫正时,用相似变换来矫正尺度漂移,把闭环误差均摊在本质图中。本质图中节点也是所有关键帧,但是连接边更少(理解为树连接关系、父子关系),只保留了联系精密的边来使得结果更精确。本质图包含:
- 生成树连接关系
- 形成闭环的连接关系,闭环后即地图点变动后新增加的连接关系
- 共视关系非常好(至少100个共视地图点)的连接关系
本质图优化相对于全局BA来说更快,相对均方误差RMSE更低,可以本质图优化+BA
4. 特征点匹配
单目初始化中的特征匹配
使用快速搜索候选匹配特征点,一开始是没有位姿的,直接把特征点的位置投到第二针上,在该处画一个圆,在圆里面找对应的特征点。后面有位姿变换了,可以变换后再画圆搜索。
什么是外点?通过角度一致性过滤外点中的错误分析
什么是词袋模型?词袋模型训练的流程。为什么要词袋模型?两两匹配还是FeatureVector?为什么用BRIEF描述子?在线图像如何生成BoW向量?
一个描述子转化为Word id, Word weight,节点所属的父节点(距离叶子深度为level up深度的节点)
一幅图像里所有特征点转化为两个std::map容器 BowVector 和 FeatureVector
相当于将当前图像信息进行了压缩,并且对后面特征点快速匹配、闭环检测、重定位意义重大。
5. 跟踪线程
跟踪分两个阶段:① 参考关键帧跟踪、恒速模型跟踪、重定位跟踪;② 局部地图跟踪。
恒速模型跟踪:假设每一帧速度是匀速的,所以用上一帧的位姿和速度来估计当前帧的位姿,这个位姿是初值,再将上一阵的地图点投影到当前帧,在不同尺度下不同搜索半径下做描述子匹配,然后优化当前位姿。优化完成后再剔除外点。会在速度变化大的时候跟踪失败
参考关键帧跟踪:恒速模型跟踪失败或者没有速度信息的时候、刚完成重定位的时候,使用参考关键帧跟踪。使用BOW进行当前帧和(最近的一个)参考关键帧特征匹配,匹配成功之后得到地图点,使用3D-2D位姿优化PNP。然后通过角度投票进行剔除误匹配。然后将上一帧的位姿作为当前帧的位姿初始值,通过优化3D-2D的重投影误差来获得准确位姿。最后剔除优化后的outlier地图点
重定位跟踪:在跟踪丢失的时候使用。用BOW找到与该帧相似的候选关键帧,然后遍历候选关键帧,用bow快速匹配。匹配点足够的情况下用EPNP计算位姿并取出其中内点做BA优化(仅优化位姿)。如果优化后内点较少,通过关键帧投影生成新的匹配点,对匹配结果再做BA优化。
局部地图跟踪:相当于前面3中跟踪方式得到的当帧地图点后的后处理,每次跟踪都会使用。首先根据之前得到的当前帧的地图点找到当前帧的一级共视关键帧,将这些一级关键帧的二级共视帧、子关键帧、父关键帧一起作为局部关键帧。将局部关键帧的所有地图点作为局部地图点,将局部地图点投影到当前帧,去掉不再视野内的无效的地图点,剩下的局部地图点投影到当前帧进行匹配,对匹配结果再做BA优化(仅优化位姿)
父关键帧:和当前关键帧共视程度最高的关键帧
子关键帧:是上述父关键帧的子关键帧
6. 局部建图线程
先看ORBSLAM2论文中局部建图的流程:
① 插入关键帧;② 剔除地图点;③ 生成新地图点;④ 局部BA优化;⑤ 剔除冗余关键帧
1.首先处理关键帧,包括计算BOW,更新观测、描述子、共视图、插入到地图等
2.根据地图点的观测情况剔除质量不好的地图点
3.当前关键帧与相邻关键帧通过三角化产生新的地图点,使得跟踪更稳
4.检查并融合当前关键帧与相邻关键帧中重复的地图点
5.通过词袋对两关键帧的未匹配的特征点快速匹配,用极线约束抑制离群点,生成新的匹配点对
6.对每对匹配通过三角化生成3D点,