文章目录
记录一下orbslam2单目的学习感受
今天仔细看了一下orbslam2单目初始化,其实我是带着问题来看的,主要是看一下它怎么处理两帧之间视差太小的问题。
先看正常情况下,进来的第一帧如果满足特征点数量大于100,那么会创建初始化器,以及保存下本帧是mInitialFrame。
继续,进来第二帧要满足特征点数量大于100,并且和mInitialFrame成功匹配的特征点数量>=100,这两个条件,如果不满足则会清空初始化器,整个系统丢弃这两帧,进来的第三帧将会重返上一步,如果这个第三帧特征点>100将会当作新的mInitialFrame。
继续,如果第二帧满足了特征点>100,且和mInitialFrame成功匹配的特征点数量>=100,那么将会调用初始化器进行两帧估计位姿,以及生成3D点,关键的来了,
mpInitializer->Initialize返回true容易理解,接着就是生成初始地图,那问题就是如果它返回false呢,仔细观察发现大概有2类情况会返回false
- 两帧恢复位姿中如果没有明显的最优结果,或者没有足够数量的三角化点,则返回失败
- 如果有最优解但是不满足对应的视差要求parallax>minParallax,则返回失败
如果返回false,并不会清空初始化器,也不会丢弃这两帧的信息,即保留mInitialFrame还是之前的第一帧,只是不进行初始化建图而已,后续第三帧会继续和mInitialFrame也就是第一帧进行三角测量,如果满足视差要求等,就会进入建图部分,建图部分会把初始化的两帧设为关键帧。
if(mpInitializer->Initialize(
mCurrentFrame, //当前帧
mvIniMatches, //当前帧和参考帧的特征点的匹配关系
Rcw, tcw, //初始化得到的相机的位姿
mvIniP3D, //进行三角化得到的空间点集合
vbTriangulated))
整体架构流程
void Tracking::MonocularInitialization()
{
// Step 1 如果单目初始器还没有被创建,则创建。后面如果重新初始化时会清掉这个
if(!mpInitializer)
{
// Set Reference Frame
// 单目初始帧的特征点数必须大于100
if(mCurrentFrame.mvKeys.size()>100)
{
// 初始化需要两帧,分别是mInitialFrame,mCurrentFrame
mInitialFrame = Frame(mCurrentFrame);
// 用当前帧更新上一帧
mLastFrame = Frame(mCurrentFrame);
// mvbPrevMatched 记录"上一帧"所有特征点
mvbPrevMatched.resize(mCurrentFrame.mvKeysUn