ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下,都能够完成初始化的工作。其中主要是使用了适用于平面场景的单应性矩阵H和适用于非平面场景的基础矩阵F,程序中通过一个评分规则来选择适合的模型,恢复相机的旋转矩阵R和平移矩阵t
那么下面主要讲解关于对极几何中的基础矩阵,本质矩阵,和单应矩阵之间的区别与联系。
对极几何(Epipolar Geometry)描述的是两幅视图之间的内在射影关系,与外部场景无关,只依赖于摄像机内参数和这两幅视图之间的相对位姿。
两视图的对极几何可以理解为图像平面与以基线为轴的平面束相交的几何关系,其中主要有几种概念:
(1)基线(base line):两个相机中心的连线CC'称为基线。
(2)对极点(epipolar):ee'是对极点,是基线与两个成像平面的交点,也就是两个相机在另一个成像平面上的像点。
(3)对极平面(epipolar plane):过基线的平面都称之为对极平面,其中两个相机的中心C和C',三维点X,以及三维点在两个相机成像点xx'这五点必定在同一对极平面上,当三维点X变化时,对极平面绕着基线旋转,形成对极平面束。
(4)对极线(epipolar line):是对极平面和成像平面的交线,所有的对极线都相交于极点。
那么由对极几何的基本性质引出了对极约束的概念,对极约束是指在平面2上的p点在平面1上的对应点一定在基线I'上,这句话说明了对极约束是一个点到直线的射影映射关系。如图所示:
根据对极约束可以引出本质矩阵和基础矩阵。在已知相机标定的情况下,假设有一个三维坐标点P(X,Y,Z)在两个视图上的点分别为p1,p2,由于第一个相机的中心作为世界坐标系的原点,也就是说第一个相机没有旋转R和平移t,通过小孔相机模型有:
p1=KP, p2=K(RP+t)
其中,K是相机的内参,R,t是第二个相机相对于第一个相机的旋转和平移。
从p1=KP可以得到
带入到第二个式子得到
两边同时乘以K_1得到
设x1,和x2表示为
带入到x2=Rx1+t中,两边同时左乘向量t的反对称矩阵t×,由于t×t=0,消除t,
两边再同时左乘xT2
由于t×x2是向量t和向量x2的叉积,同时垂直于向量t和向量x2,所以左边的式子为0得到:
将x1,x2替掉
上式是对极约束的一种表示,该式子中仅包含像点,相机的旋转和平移,中间的矩阵就是基础矩阵F:
当K已知时提取中间的矩阵得到本质矩阵E,E矩阵同样表示的是对极约束的关系,只不过它不再涉及相机内参,只由两视图之间的姿态关系决定:
F矩阵的性质有三:
1, 3*3且自由度为7的矩阵
2,kF 为基础矩阵,相差一个尺度自由度
3,F矩阵的秩为2
基础矩阵的求解方法:
1,直接线性变换法(8点法+最小二乘法)
2,RANSAC-估计基础矩阵
求解基础矩阵后,我们实际上是想求R和t.所以还是要继续求解本质矩阵直到分解出R,t
E矩阵的性质:
(1)3*3且自由度为5的矩阵
(2)因为只包含R,t共有6个自由度,又因为尺度等价去掉一个自由度
(3)本质矩阵E的奇异值 必定为[ delta delta,0]T 的形式
ORB-SLAM中通过E、F矩阵就可以利用两视图中的匹配点求解出相对姿态了,不过这个方法存在一个问题——当两个视图的相机中心相同时,也就是R,t中的t为0,这时对极几何的基础也就不成立了,可知E、F均为0无法求解。这时就需要使用平面间的单应性H矩阵恢复R,t。
单应性矩阵Homogeneous是射影几何中的一个术语,又称之为射影变换。本质上是一个数学概念,一般所说的单应矩阵是平面上的单应性矩阵,主要用来解决两个问题:
(1)表述真实世界中一个平面与他对应图像的透视变换
(2)通过透视变换实现图像从一个视图变换到另一个视图的转换。
把一个射影平面上的点(三维齐次矢量)映射到另一个射影平面上,并且把直接射影为直线,具有保线性,总的来说单应是关于三维齐次矢量的一种线性变换,如图所示,两个平面之间的关系可以用一个3*3的非奇异矩阵H表示x1=Hx2,H表示单应矩阵,定义了八个自由度。这种关系定义为平面单应性。
假设已经取得了两图像之间的单应,则可单应矩阵HH可以将两幅图像关联起来:
其中,(u1,v1,1)T(u1,v1,1)T表示图像1中的像点,(u2,v2,1)T(u2,v2,1)T是图像2中的像点,也就是可以通过单应矩阵H将图像2变换到图像1,该功能有很多实际的应用,例如图像的校正、对齐以及在SLAM中估计两个相机间的运动。并保持某些性质的不变性,显然具有保线性。
而在视觉slam中一般为同一相机在不同的位姿得到同一平面的图像有以下公式
以上公式如何推导而来呢?假设使用同一相机在不同的位姿下拍摄了同一平面,如图:
上图表示场景中的平面π在两相机的成像,设平面π在第一个相机坐标系下的单位法向量为N,其到第一个相机中心(坐标原点)的距离为d,则平面π可表示为:
变换为
其中,X1是三维点P在第一相机坐标系下的坐标,其在第二个相机坐标系下的坐标为X2,则
将上面式子结合起来有
得到了同一平面两个不同相机坐标系的单应矩阵
单应矩阵求解方法:
(1)直接线性变换法。
(2)RANSAC-估计单应矩阵
平面的单应矩阵和对极约束的F矩阵的区别
两图像间的对极约束和场景的结构无关,可以理解对极约束对于任意场景结构的两幅图像都是成立的,约束是不能给出两幅图像上的像点的一一对应关系,但是可以给出点对应的必要条件,另一幅图像上对应的像点位于对应的对极线上。基础矩阵F描述的实际是一种点和直线的映射关系,而不是一种点对点的约束关系,并不能给出另一个点的确切位置。
平面间的单应矩阵,并不像对极约束完全不需要场景的结构信息,它对场景的结构有了要求,场景的点必须在同一个平面上,因此单应矩阵H也就能够对两图像上对应点的提供更多的约束,知道了某点在一幅图像的像点位置后,可以通过单应矩阵,求得其在另一幅图像中像点的确切位置。
单应矩阵的应用场景是相机只有旋转而无平移的时候,两视图的对极约束不成立,基础矩阵F为零矩阵,这时候需要使用单应矩阵H,场景中的点都在同一个平面上,可以使用单应矩阵计算像点的匹配点。 相机的平移距离相对于场景的深度较小的时候,也可以使用单应矩阵H。
本文内容推导大部分来自《视觉SLAM14讲》。如有补充请大家积极留言,并且希望大家能够在阅读论文或者有推荐的论文或者开源代码,只要和点云相关,都可以留言给群主,如果有必要将会出与你推荐相关的资料。希望大家能够积极参与分享。如有侵权请第一时间联系本平台,将及时删除。
资源
三维点云论文及相关应用分享
【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法
3D目标检测:MV3D-Net
三维点云分割综述(上)
3D-MiniNet: 从点云中学习2D表示以实现快速有效的3D LIDAR语义分割(2020)
win下使用QT添加VTK插件实现点云可视化GUI
JSNet:3D点云的联合实例和语义分割
大场景三维点云的语义分割综述
PCL中outofcore模块---基于核外八叉树的大规模点云的显示
基于局部凹凸性进行目标分割
基于三维卷积神经网络的点云标记
点云的超体素(SuperVoxel)
基于超点图的大规模点云分割
更多文章可查看:点云学习历史文章大汇总
SLAM及AR相关分享
【开源方案共享】ORB-SLAM3开源啦!
【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM
【点云论文速读】StructSLAM:结构化线特征SLAM
SLAM和AR综述
常用的3D深度相机
AR设备单目视觉惯导SLAM算法综述与评价
SLAM综述(4)激光与视觉融合SLAM
Kimera实时重建的语义SLAM系统
SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM
易扩展的SLAM框架-OpenVSLAM
高翔:非结构化道路激光SLAM中的挑战
SLAM综述之Lidar SLAM
基于鱼眼相机的SLAM方法介绍
往期线上分享录播汇总
第一期B站录播之三维模型检索技术
第二期B站录播之深度学习在3D场景中的应用
第三期B站录播之CMake进阶学习
第四期B站录播之点云物体及六自由度姿态估计
第五期B站录播之点云深度学习语义分割拓展
第六期B站录播之Pointnetlk解读
[线上分享录播]点云配准概述及其在激光SLAM中的应用
[线上分享录播]cloudcompare插件开发
[线上分享录播]基于点云数据的 Mesh重建与处理
[线上分享录播]机器人力反馈遥操作技术及机器人视觉分享
[线上分享录播]地面点云配准与机载点云航带平差
点云PCL更多活动请查看:点云PCL活动之应届生校招群
扫描下方微信视频号二维码可查看最新研究成果及相关开源方案的演示:
如果你对本文感兴趣,请点击“原文阅读”获取知识星球二维码,务必按照“姓名+学校/公司+研究方向”备注加入免费知识星球,免费下载pdf文档,和更多热爱分享的小伙伴一起交流吧!
以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享及合作方式:可联系微信“920177957”(需要按要求备注)联系邮箱:[email protected],欢迎企业来联系公众号展开合作。
点一下“在看”你会更好看耶
看龙书的时候发现一个矩阵在传入Shader之前都要转置一下,很好奇为什么要有一步这样的操作。行主序和列主序行主序指矩阵在内存中逐行存储,列主序指矩阵在内存中逐列存储。行主序矩阵内存布局:列主序矩阵内存布局:行向量和列向量行向量指的是把向量当成一个一行n列的矩阵,列向量指的是把向量当成一个n行一列的矩阵。左乘和右乘矩阵“左乘”:矩阵和向...
矩阵可分为稠密矩阵和稀疏矩阵,对于稀疏矩阵而言,使用同样的内存来存储这个矩阵显然是对内存的浪费,那么我们就可以想办法将矩阵中所有的o元素挥着不相关元素剔除,怎么剔除,第一种方法是通过三个一维矩阵来存储原二维矩阵中的所有非0元素,三个矩阵分别为value、column、row, value 数组存储所有的非零元素, column 数...
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const; m – 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配。rtype – 目标矩阵的类型。因为目标矩阵的通道数与源矩阵一样,所以rtype也可以看做是目标...
https://blog.csdn.net/jiangdf/article/details/8460012 glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL...
MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:4h 38m |大小解压后:1.65 GB 含课程文件 Maya的相机工具是所有3D包中最好的。在本课程中,作者亚伦·罗斯分享了Maya相机布局和动画的专家技术。Aaron从创建...