orbslam2单目初始化的两帧的选择

记录一下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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清清紫金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值