ORBSLAM2单目初始化过程

转自博客:https://blog.csdn.net/zhubaohua_bupt/article/details/78560966

ORB单目模式的初始化过程可以分为以下四个阶段:

1 通过匹配选取两个可以作为起始两帧的初始帧

2 根据匹配计算两帧之间的位姿

3 三角化测量初始的特征点云深度,进而获得点云地图。

4 BA优化初始点云

在初始化后,单目模式和双目及RGBD模式一样,都是通过PNP来计算位姿。

下面,说一下初始化算法的步骤:

第一阶段:选取两个可以作为起始两帧的初始帧

这一阶段做的工作是,选取是两个特征点数目大于100的两个连续帧,并进行匹配,

只有当前后帧匹配点对比较多时(代码>100),才认为这两帧可以进行初始化并记录下来两帧的匹配关系,

接下来开始尝试求取两帧之间的位姿。

否则从头开始,重新开始尝试初始化。

第二阶段:根据匹配计算两帧之间的位姿

ORB实现的是自动初始化,也就是,无论场景平面,还是普通场景,都能完成初始化工作。

其做法是同时计算适用于平面场景的单应性矩阵(H)和适用于普通场景的基础矩阵(F),

方法是:

首先,由抽样点对,计算出单次抽样的H和F矩阵(DLT,八点法);通过若干次RANSAC抽样,

计算出最优的H和F矩阵;

然后,通过一定机制比较H和F矩阵,选择最优的矩阵,恢复出来帧间位姿。

并行计算两个模型:

在两个线程上并行计算单映射矩阵模型和基础矩阵模型 :

为了使两个模型的计算流程尽量一样,用于计算H和F矩阵的迭代循环次数预先设置成一样(代码中为200次),

每次用迭代计算的匹配特征点对也是一样的。基础矩阵是8个特征点对,单映矩阵是其中的4个特征点对。

从若干次RANSAC中,计算出最优的H和F矩阵:

每次迭代中,给每个模型M(H表示单映射,F表示基本矩阵)计算一个分值SM:

其中

TM是无效数据的排除阈值,

它的依据是卡方测试的95%(TH=5.99, TF=3.84,假设在测量误差上有1个像素的标准偏差)。

TM等于TH,这样,对于同一个重投影误差d,两个模型求取的分值相同。

模型M越准,所有匹配点对的重投影误差越小,SM的值就越大。

因此SM的值反映了一个这样的问题,当其越大时,模型M越准确。

我们从单映射矩阵和基本矩阵的计算中选择分值最高的,分别记作为SH和SF,

但如果两个模型分值都不高(意味着没有足够的局内点),就重新选择第二帧,重新匹配并尝试初始化。

模型选择(用基础矩阵还是用单应性矩阵?)

如果场景是平面,近平面或存在低视差的情况,则可以通过单映矩阵来求解。

同样地,我们也可以找到一个基础矩阵,但问题是基础矩阵不能够很好的约束该问题,而且从基础矩阵中计算得到的运动结果是错误的。在这种情况下,我们应该选择单映矩阵才能保证地图初始的正确性,或者如果检测到低视差的情况则不进行初始化工作。

另一方面,对于非平面场景且有足够的视差的情况则可以通过基础矩阵来计算,

而在这种情况下单映矩阵只有基于平面点或者低视差的匹配点才能找到。因此,

在这种情况下我们应该选择基础矩阵。我们利用如下强大的启发式进行计算:

如果RH>0.45 ,这表示二维平面和低视差的情况,我们将选择计算单应矩阵。其他的情况,我们选择基础矩阵。

从模型恢复位姿

一旦选择好模型,我们就可以获得相应的运动状态。如果选择单映矩阵,我们按照Faugeras等人发表的论文中提到的方法,提取8种运动假设,该方法提出用cheriality测试来选择有效解。

然而,如果在低视差的情况下,这些测试就会失效,因为云点很容易在相机的前面或后面移动,会导致选解错误。我们提出的方法是直接按这8种解将二维点三角化,然后检查是否有一种解可以使得所有的云点都位于两个相机的前面,且重投影误差较小。如果没有一个最优的解,我们就不执行初始化,否则重新选择第二帧,重新匹配并尝试初始化。

这种方法使初始化程序在低视差和两个交叉的视图情况下更具鲁棒性,这也是我们整个算法体现鲁棒性的关键所在。

在基本矩阵的情况下,我们使用标定矩阵K用下式将其转换为本证矩阵:

然后奇异值分解方法计算4个运动解,然后就像上文中叙述的一样,我们将四个解用于三角化特征点,以选择正解。

第三阶段:三角化测量初始的特征点云深度,进而获得点云地图。

一旦恢复出两帧之间位姿(单目无尺度),就可以求解匹配点对的深度(无尺度),求解时可以以任意一帧为基坐标系,由于这里是要以做SLAM,所以以第一帧为世界坐标系。代码中采用多视图几何书中11.2线性三角形法中的齐次方法(DLT)进行三角测量恢复匹配点对应的三维信息。

基本原理如下,已知一组匹配点分别在两幅图像中的二维坐标,利用叉乘为0可以代表共线的几何属性和帧间位姿,构建一个AX=0的方程,其中X是大小4x1向量,是该匹配点对所对应的三维点的齐次表示。然后通过SVD分解来求方程AX=0,对此方程SVD分解本身具有最小二乘效果,可以解决在解方程时,由位姿噪声带来的问题。其基本思想和http://blog.csdn.net/zhubaohua_bupt/article/details/74926111一致。

第四阶段:  对以上恢复的点云和位姿做 Bundleadjustment

最后执行一个全局BA,以优化初始重构得到的点云地图。

以上内容来自于ORBSLAM论文和源码。

ORBSLAM2单目初始化过程的更多相关文章

  1. ORB-SLAM3 细读单目初始化过程(上)

    作者:乔不思 来源:微信公众号|3D视觉工坊(系投稿) 3D视觉精品文章汇总:https://github.com/qxiaofan/awesome-3D-Vision-Papers/ 点击上方&qu ...

  2. ORB-SLAM2 论文&代码学习 —— 单目初始化

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12358458.html 本文要点: ORB-SLAM2 单目初始化 ...

  3. ORB-SLAM (四)tracking单目初始化

    单目初始化以及通过三角化恢复出地图点 单目的初始化有专门的初始化器,只有连续的两帧特征点均>100个才能够成功构建初始化器. ); 若成功获取满足特征点匹配条件的连续两帧,并行计算分解基础矩阵和 ...

  4. ORB-SLAM (四)Initializer单目初始化

    一. 通过对极约束并行计算F和H矩阵初始化 VO初始化目的是为了获得准确的帧间相对位姿,并通过三角化恢复出初始地图点.初始化方法要求适用于不同的场景(特别是平面场景),并且不要进行人为的干涉,例如选取 ...

  5. 单目、双目和RGB-D视觉SLAM初始化比较

    无论单目.双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧. (1) 单目 mCurrentFrame = ...

  6. 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)

    doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...

  7. 基于OpenCV单目相机的快速标定--源码、工程、实现过程

    相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享. 1.单目相机标定的工程源码 首先请到同性交友 ...

  8. Spring源码分析:非懒加载的单例Bean初始化过程(下)

    上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...

  9. Ubuntu16.04下编译安装及运行单目ORBSLAM2

    官网有源代码和配置教程,地址是 https://github.com/raulmur/ORB_SLAM2 1 安装必要工具 首先,有两个工具是需要提前安装的.即cmake和Git. sudo apt- ...

随机推荐

  1. DBShop后台RCE之曲线救国

    本文最早发布在朋友的公众号 黑客信徒 中,文章是自己写的 不存在抄袭  特此申明 --------------------- 前言 DBShop是一款基于ZendFramework2框架的电子商务系统 ...

  2. 用Jmeter做性能测试,之后报表展示

    https://octoperf.com/blog/2017/10/19/how-to-analyze-jmeter-results/ 看到性能测试平台的开发,我在想需要什么功能,报表需要什么样子的 ...

  3. sublimerge

    Package Control Messages======================== Sublimerge 3------------ Sublimerge 3 (beta) has ju ...

  4. python中赋值和浅拷贝与深拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  5. python 根据两个字段排序, 一个升序, 一个降序

    from collections import Counter c = Counter(input()) l=sorted(c.items(), key=lambda s:(-s[], s[])) ] ...

  6. WinForm DevExpress使用之ChartControl控件绘制图表一——基础

    最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...

  7. RedisTemplate和StringRedisTemplate的区别

    今天springboot项目中用redis的时候,遇到了一个问题,用RedisTemplate这个类向redis中存储数据的时候,明明数据存进去了,也可以取出来,但是rdm就是看不到key的值,网上的 ...

  8. django rest framework框架中都有那些组件

    1.权限 2.认证 3.访问频率 4.序列化 5.路由 6.视图 7.分页 8.解析器 9.渲染器 规定页面显示的效果(无用) https://www.cnblogs.com/Rivend/p/118 ...

  9. BZOJ 1181: [CROATIAN2009] IZBROI选举(二分+dp)

    题面 在一个地区的选举中,共有V个人参加了投票,每一票只可能投给N个政党中的一个.当地的议会共有M个席位.不妨将N个政党编号为1到N,并且设编号为i的政党最终的得票为Vi,则议会中的席位按如下规则分配 ...

  10. Sql Server (MSSQLSERVER) 服务无法启动

    北京的冬天特别干燥,大清早的一同事就和服务器擦出了爱的火花,结果没想到竟导致服务器无法开机了,这可尴尬了,代码可都在服务器上托管着呢,一会还等着上线呢,必须得修啊.他们说是主板坏了,就另外找了一台电脑 ...