ORB-SLAM (四)Initializer单目初始化
一. 通过对极约束并行计算F和H矩阵初始化
VO初始化目的是为了获得准确的帧间相对位姿,并通过三角化恢复出初始地图点。初始化方法要求适用于不同的场景(特别是平面场景),并且不要进行人为的干涉,例如选取视差大(large parallax)的场景(视差大代表相机移动会带来明显的图像变化,通常距离相机距离越远,距离相机光轴越近,视差越小)。ORB-SLAM中并行计算了适用于平面场景的单应性矩阵H和一般场景下的基础矩阵F,然后通过打分选取合适的。ORB-SLAM的初始化要求是比较高的,只有在确定初始化安全的情况下,才会去初始化。
首先复习一下对极约束
F矩阵适用于3D点不共面的情况,我们以左侧相机为参考系,约定
相机内参K,
空间点坐标P = [X, Y, Z]T; 齐次坐标为[X, Y, Z, 1]T
在Z=1归一化平面上的坐标为xi = [X/Z, Y/Z, 1]T,i=1, 2
图像平面坐标为pi = [u, v],i=1, 2; 齐次坐标为[u, v, 1]
可以推出pi = Kxi
对极约束就是满足:
p2T K-T t^R K-1 p1=0
x2T t^R x1 = 0
其中 E = t^R 称为本质矩阵(Essential Matrix),F = K-T t^R K-1基础矩阵(Fundamental Matrix),根据匹配点的坐标p1, p2可以计算出F矩阵和E矩阵,E矩阵可以通过8点法求解线性方程组得到,然后通过对E矩阵奇异值分解E = UΣVT,注意其中奇异值应该是[σ, σ, 0]的形式,表示图像仅在2维空间中经过了缩放。如果发现获得奇异值不满足,需要将矩阵投影到E所满足的流形上。最后通过U, Σ, V计算出t和R
H矩阵适用于3D点共面的情况
设P点所在平面满足 nTP+d=0
将其结合对极约束p2 = K(RP+t)
可以得到H矩阵与匹配点坐标p1,p2之间的关系,同样可以通过求解线性方程然后分解矩阵的方法来获取t和R
二. 步骤
1. 在金字塔0层上提取特征点,匹配前后两帧,得到像素坐标下的匹配点。
2. 并行计算H矩阵和F矩阵,其中H矩阵使用归一化的DLT(直接线性变换)方法,F矩阵使用8-点法,具体可以参考[1], H矩阵使用8个点,F矩阵使用4个点,迭代次数设定为相同,打分机制也设定平衡。
3. 如果场景接近平面,或者视差较小,可以使用单应性矩阵来解释。通过打分机制选择模型。
4. 利用选择的模型,恢复运动和地图点。分解H矩阵可以恢复出8种姿态,SVD分解E矩阵也可以恢复出4种姿态,通过深度值以及场景的先验信息,一般可以得到唯一满足要求的。但是小视角情况下会出现判断错误的情况出现,因此ORB-SLAM中选择使用这些备选姿态直接三角化出地图点,再通过视角,深度以及重投影误差来判定是否有唯一解,若没有,则放弃,重新回到第一步去初始化。
5. 若初始化成功,则进行GlobalBundleAdjustment
相比于PTAM和LSD-SLAM,ORB在NewCollege的室外平面场景中初始化鲁棒性是比较出色的。
[1] 高翔,视觉SLAM十四讲
ORB-SLAM (四)Initializer单目初始化的更多相关文章
- ORB-SLAM (四)tracking单目初始化
单目初始化以及通过三角化恢复出地图点 单目的初始化有专门的初始化器,只有连续的两帧特征点均>100个才能够成功构建初始化器. ); 若成功获取满足特征点匹配条件的连续两帧,并行计算分解基础矩阵和 ...
- ORBSLAM2单目初始化过程
ORBSLAM2单目初始化过程 转自博客:https://blog.csdn.net/zhubaohua_bupt/article/details/78560966 ORB单目模式的初始化过程可以分为 ...
- ORB-SLAM3 细读单目初始化过程(上)
作者:乔不思 来源:微信公众号|3D视觉工坊(系投稿) 3D视觉精品文章汇总:https://github.com/qxiaofan/awesome-3D-Vision-Papers/ 点击上方&qu ...
- ORB-SLAM2 论文&代码学习 —— 单目初始化
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12358458.html 本文要点: ORB-SLAM2 单目初始化 ...
- 单目、双目和RGB-D视觉SLAM初始化比较
无论单目.双目还是RGB-D,首先是将从摄像头或者数据集中读入的图像封装成Frame类型对象: 首先都需要将彩色图像处理成灰度图像,继而将图片封装成帧. (1) 单目 mCurrentFrame = ...
- Semantic Monocular SLAM for Highly Dynamic Environments面向高动态环境的语义单目SLAM
一.摘要 当前单目SLAM系统能够实时稳定地在静态环境中运行,但是由于缺乏明显的动态异常处理能力,在动态场景变化与运动中往往会失败.作者为解决高度动态环境中的问题,提出一种语义单目SLAM架构,结合基 ...
- iOS: 聊聊 Designated Initializer(指定初始化函数)
iOS: 聊聊 Designated Initializer(指定初始化函数) 一.iOS的对象创建和初始化 iOS 中对象创建是分两步完成: 分配内存 初始化对象的成员变量 我们最熟悉的创建NSOb ...
- 从零开始一起学习SLAM | 神奇的单应矩阵
小白最近在看文献时总是碰到一个奇怪的词叫“homography matrix”,查看了翻译,一般都称作“单应矩阵”,更迷糊了.正所谓:“每个字都认识,连在一块却不认识”就是小白的内心独白.查了一下书上 ...
- 三角化---深度滤波器---单目稠密重建(高翔slam---十三讲)
一.三角化 [1]三角化得到空间点的三维信息(深度值) (1)三角化的提出 三角化最早由高斯提出,并应用于测量学中.简单来讲就是:在不同的位置观测同一个三维点P(x, y, z),已知在不同位置处观察 ...
随机推荐
- 郝斌 SqlServer2005 学习笔记
1.0 什么是数据库 狭义:存储数据的仓库. 广义:可以对数据进行存储和管理的软件以及数据本身统称为数据库. 另外一种说法:数据库是由表.关系.操作组成. 2.0 为什么要学习数据库 几乎所有的应用软 ...
- java:transient是什么,有什么作用
参考博客:Java transient关键字 “Java的serialization提供了一种持久化对象实例的机制.当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机 ...
- 用python实现矩阵转置
前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...
- Yii 验证和消息
setFlash(), getFlash()可以完成验证成功后提示 <?php # 成功信息提示 Yii::app()->user->setFlash('success', &quo ...
- SQL Server的跨服务器数据访问方法
想要在SQL服务器上访问另一个服务器的数据,可以采用此方式: 1.建立数据库链接: 右键“链接服务器”,选择“新建链接服务器...” 以上的操作也可以通过SQL脚本实现: exec sp_addlin ...
- VGG使用重复元素的网络
由5个卷积层块(2个单卷积层,3个双卷积层),3个全连接层组成——VGG-11 from mxnet import gluon,init,nd,autograd from mxnet.gluon im ...
- heatmap for arcgisjsapi
在arcgis for js api 环境下使用heatmap插件. 由于最新的heatmap没有提供 for arcgisjsapi 插件,懒得研究新版本代码,所以这里用的还是老版本的heatma ...
- 解决pycharm无法导入本地包的问题
在用python写爬虫程序时,import 行无法通过,具体情况如下: pycharm运行程序后,程序pass了,但是出现了警告,如下图所示: 这是由于该程序不在根目录下,无法导入本地包,解决办法如下 ...
- ORA-04044: 此处不允许过程, 函数, 程序包或类型和
用Orale代码建表时,出现 SQL> comment on column SCORE.cno 2 is '学号(外键)';comment on column SCORE.cno is '学号( ...
- Windows中杀死某个端口对应的进程
netstat -ano | findstr 3000 //列出进程极其占用的端口,且包含 3000 tasklist | findstr 17692 // 查看是什么程序占用的 taskkill - ...