文章目录
1.0 本征矩阵含义,基础矩阵含义
- 链接:https://blog.csdn.net/ssw_1990/article/details/53355572
本征矩阵含义——相机坐标系的关系;
基础矩阵含义——图像像素坐标系的关系(加入内参)
本征矩阵$$E包含物理空间中两个摄像机相关的旋转和平移信息,本征矩阵E将左摄像机观测到的点的物理坐标与右摄像机观测到的相同点的位置关联起来。
基本矩阵除了包含的信息外,还包含两个摄像机的内参数。基本矩阵F则是将一台摄像机的像平面上的点在图像坐标[像素]上的坐标和另一台摄像机的像平面上的点关联起来。
应用场景
①通过多组对应3D点(Correspondence)进行帧间匹配,求出本质矩阵E。
②通过对E进行分解求出外参数R和t,即相机姿态。
2.0 Epipolar Geometry对极几何
基本概念
- https://www.cnblogs.com/clarenceliang/p/6704970.html
对极几何(Epipolar Geometry)是Structure from Motion问题中,在两个相机位置产生的两幅图像的之间存在的一种特殊几何关系。描述的是两幅视图之间的内在射影关系,与外部场景无关,只依赖于摄像机内参数和这两幅试图之间的的相对姿态。
对极几何成立的条件就是两张或多张影像观测到同一场景(物体)。
要想计算对极几何,需要空间中至少8对3D对应点对。注意是三维点坐标而不是像素平面内的二维坐标。
基本模型
其中c0、c1为两个相机中心,p为空间中一点,p在c0、c1对应像平面上的投影分别为x0、x1。c0、c1连线与像平面的交点e0、e1称为极点(Epipoles),l0、l1称为极线(Epipolar Lines),c0、c1、p三点组成的平面称为极平面(Epipolar Plane)。
基线:两相机光心连线;
对极点 = 基线与像平面相交点 = 光心在另一幅图像中的投影;
对极平面 = 包含基线的平面;
对极线 = 对极平面与像平面的交线
对极约束(Epipolar Constraint)
对极几何中最重要的一条公式是对极约束(Epipolar Constraint)
根据针孔相机模型,相机成像平面一点的像素坐标和该点在世界坐标系下的3D坐标有的关系,如果用齐次坐标表示则有:
其中d是空间点深度(为了将p的齐次项变为1),K是相机内参数矩阵,p和P都是齐次坐标。
于是如果以第一个相机的坐标系为参照,对于两个相机则有:
其中R为旋转矩阵(Rotation),t为平移向量(Translation)。令,去掉内参K归一化成:
由这两式得:
在Bob与Mike 之间形成了一个向量t,这个t是在Mike的坐标系下衡量的。
两边同时叉乘t消去加号后面单独的t项:
进而:
再在两遍同时坐乘一个:
由于等号左边乘上了一个和自身垂直的向量,所以等于0,故:
该等式称为对极约束(Epipolar Constraint)。
对极约束的几何意义:三者混合积为0,表示这三个向量共面,即上图中三角形的三边共面。
3.0 本征矩阵E
令,得到对极约束的新形式:
称为本质矩阵(Esential Matrix),由外参数决定。
本质矩阵的几何意义:上,表示投影到另一帧图像中的直线上。
可以看到,E是由t和R做叉乘得到的,所以这个简单的3×3矩阵包含了两个相机之间的相对旋转与平移。而且从上式也可以看出来它也相对好求,只需要一些对应点对即可。再温馨提示***意是Bob坐标系下的3维点,是Mike坐标系下的3维点。假如获得了多对对应点,就可以能求出E,既然E是由t和R叉乘得到的,所以得到E了以后就可以用一些数学方法分解得到R和t。
极线(Epipolar Line)
刚刚介绍了,Bob和Mike之间的三个向量形成了一个平面,这个平面与Mike的像平面相交,得到的交线就是极线(Epipolar Line)。而当他们同时指向另一个角点的时候,会发现这个平面以及它与Mike像平面的交线也跟着变化了。不同的点对应着不同的平面和极线,平面的方向随着我们指向的3D点而不断变化。
极点(Epipole)
值得注意的是在Mike像平面中的所有极线都会交于一点,这一点便成为极点(Epipole)。之所以出现这样的情况也是很容易理解的:因为不管这些平面如何变化,构成这个平面的向量之一t是不变的,t与Mike像平面的交点(如果像面足够大的话)也就是极点。
极线
合并,的乘积是一个3维向量,这个向量可以看作是齐次坐标系下的一条直线。
首先温习一下齐次坐标系下的直线表示:对于齐次坐标系下的两个点A和B,经过A、B的直线就等于从相机光心指向A形成的向量Va、指向B形成的向量Vb的叉积。换句话说就是直线AB就是Va、Vb构成平面的法向量。
有了这个知识以后再来看,把写开就是:。先看它其实就是表示将Bob相机坐标系下的坐标旋转到了Mike的相机坐标系下,而且还在由构成的平面内,这样的话再与它做叉乘,得到的就是这个平面的法向量。而本身就是在这个平面里面的,所以再和这个法向量相乘结果为0。也自然与叉乘为0,所以说Mike像平面中的这一点经过这条线。就是经过点的在Mike像平面里的极线。
同理反向推导一下就可以得到在Bob像平面中的极线为。
最小二乘做SVD分解即可求解得到极点坐标e0或e1向量
而对于Bob像平面中的极点和Mike像平面中的极点可分别按上图中的公式求解,形成一个方程组,用最小二乘做SVD分解即可求解得到e0或e1向量,也就是齐次表示的极点坐标。极点可以看作是两个相机光心之间的向量,因此两个相机一定都会在这条线上(只能知道在这条线上或者说方向上,但不知道具体在哪里)。
c0、c1为两个相机中心;
对极点e0,e1 = 基线与像平面相交点 = 光心在另一幅图像中的投影;
4.0 基本矩阵F
- 链接:https://blog.csdn.net/ssw_1990/article/details/53355572
由于本质矩阵E并不包含相机内参信息,且E是面向相机坐标系的。实际上,我们更感兴趣的是在像素坐标系上去研究一个像素点在另一视图上的对极线,这就需要用到相机内参信息将相机坐标系和像素坐标系联系起来。
上图:camera到image
是相机坐标系中的3D坐标值,对应的像素坐标坐标系的坐标值值为,摄像头内参矩阵为K,则有:
所以我们不妨把,从相机坐标系到像素坐标系的转换放进来,合并写成如下图所示。
因为
所以
这里,我们就得到Fundamental Matrix:
并有
。
这样,我们就把中间的既包含E又包含K的这一部分起个名字叫做基础矩阵F,它概括了两个相机之间的所有关系(成像、旋转、平移)。
可以看到,由于我们把相机到像素坐标系的转换放到基础矩阵F里了,所以基础矩阵“沟通”的就是两张影像像素坐标之间的关系。这就非常好,正是我们想要的。而且如果知道内参矩阵K,由F恢复E也是容易的。
5.0 本质矩阵与基础矩阵计算
求解基础矩阵需要8对点,每一对点都可以提供一个方程。把这个方程中的f元素提取出来,写成Ax=0的形式如下。
对于这种齐次方程,可以按照下面的方法求解。也就是之前最常用的SVD分解然后取V的最后一列。
这里需要注意的是获得的9×1的解向量中F矩阵中各元素的顺序。前三个为F矩阵的第一列,然后是第二列、第三列。
这点需要注意。这和之前求解单应矩阵不同,求解单应矩阵时解的顺序是h11、h12、h13,前三个为H矩阵的第一行,以此类推。
需要注意元素顺序,因为这涉及到是否需要转置的问题。
当然,最后别忘了数值解法得到的F不一定满足F性质(秩等于2)的,所以需要用SVD“清洗”(压缩数据)一下结果,得到满足条件的最逼近于求解结果的F矩阵。
SVD压缩数据
简单来说就是对得到的F矩阵再进行一次SVD分解,让分解得到的D的最后一个元素为0,重新相乘得到的F就是符合“秩约束”的最逼近的结果。
这里之所以说是“逼近”或者说“近似”是因为我们强行让D的最后一项为0,相当于我们忽略了那一维所代表的矩阵信息。利用SVD恢复了一个和求解得到的F相似的矩阵。
我们强行让D的最后一项为0是否合理呢?答案是合理的。因为一般而言,求解出来的D的最后一个元素都会接近0,让它为0不会损失什么精度。
最小二乘求解的F可能有Outliers敏感
另外需要注意的是,我们这里是使用最小二乘求解的F,最小二乘对于Outliers特别敏感,我们无法100%保证通过匹配算法得到的匹配点是精确的,所以用于求解F的点对很可能有Outliers。对于这种情况之前也提到过,就是是用RANSAC进行过滤。
回顾RANSAC
课程中的演示
利用SVD数值求解得到F之后,再对F进行SVD分解,使D的最后一项为0,重新构建,得到最终的F。
在得到基础矩阵F之后就可以求极线了。这样求得的是一个齐次坐标表示的三维向量,然后使其前两项的模为1,就可以得到方向cos和sin了。
求解得到的是一个齐次坐标系下的三维向量,要想获得在像平面内的坐标,需要使向量的最后一维为1,这样得到的就是像平面内的坐标了。
6.0 由本质矩阵或基础矩阵恢复旋转与平移
- https://www.cnblogs.com/houkai/p/6665506.html
然后根据F矩阵和相机内参,即可得到本质矩阵E。求解得到本质矩阵E。而根据前面E的定义它等于t×R。
我们已知:
- c0、c1为两个相机中心;
- 对极点e0,e1 = 基线与像平面相交点 = 光心在另一幅图像中的投影;
- E的定义它等于t×R
- 影像2中的极点与E相乘结果为0()
可以得到:t=坐标系原点的平移=表示影像2中的极点(齐次表示)
这个t=表示影像2中的极点难理解:
这个需要从极点的定义进行理解,极点就表示另一个相机的光心在当前影像中的位置。对于Bob的坐标系原点,以齐次坐标形式写即为(0,0,0,1)。而将它与R和t构成的投影矩阵P2相乘,就可以得到Bob坐标系的原点在Mike坐标系下的坐标,而这个坐标就是Mike坐标系中的极点。
()可以得到一个关于的方程。
我们可以对E进行SVD分解,得到的U的第三列即是E的零空间,所以
但由于齐次坐标的尺度不确定性,乘以任意非零常数(可正可负)都成立,所以最终t有u3和-u3两种情况。
所以上面说了一大堆,简单来说就是平移t等于对E进行SVD分解,分解结果U的最右边一列,并且有正负两种情况。
因为前面已经得到,它就是U矩阵的第三列,所以将的反对称矩阵改写成图中绿色部分所示的内容。这样就用U矩阵表达了的反对称矩阵。
对于旋转矩阵R,我们也可以认为包含三个部分:
这里Y是未知量,其余都是已知量。这样假设是便于后续计算方便。
这样的话,和U相乘就消去成单位阵了。
按照对应项相等的原则,可以发现等式两边粉色部分应该相等。
这样就构造了一个可以用于求解Y的约束。
求解Y的约束——可以求解得到Y有两种情况
可以看到,t有两种情况,R有两种情况,所以共有4种可能性。
这里需要注意的是,如果恢复出来的R的行列式为-1,则不满足旋转矩阵的性质了,这时就对t和R同时添加负号。
总结流程
1.给定两张影像,获得对应的3D坐标点对。
2.先计算基础矩阵F,
3.然后结合相机内参矩阵K,恢复本质矩阵E。
4.对E进行SVD分解,平移t就等于U的最右边一列(正负两种情况)。旋转R就等于Y或YT与VT的乘积,Y就是上面提到的矩阵。如果恢复出来的R行列式为-1,对R和t同时取负号。
F/E矩阵得到的相机位姿是相对于第一帧的位姿
最后需要提醒的是,求解的相机位姿是相对于第一帧的位姿,所以说如果想获得在世界坐标系下的真实位姿还需要再根据第一帧的真实姿态进行转换。
4个解的几何解释
- https://www.cnblogs.com/houkai/p/6665506.html
显然前面两个解的差别就是第一个摄像机到第二个摄像机的平移矢量是反向的。上下两行的差别在于摄像机绕基线旋转了180度,上图中只有(a)时,重构点同时出现在两个摄像机的前面。
采用视图重建的方法选择正确解
从匹配点对中随机选择n对特征点,采用视图重建的方法,分别基于四种可能的摄像机矩阵重建出对应的三维点,满足景深为正的点数最多的解就是对应的,同时也可以确定相机的外参R和t。
视图重建通过三角化实现
简单来说就是根据得到的R、t对影像中的点进行三角化,看三角化后的三维坐标在第一帧的坐标系下的Z分量是否为正,如果为负则说明是错的。
满足景深为正的点数最多的解就是对应的
实际操作中由于误匹配噪声等影响,不可能所有点都为正,所以是判断4种情况中哪个对应获得的Z分量为正的坐标点数量最多就认为哪个估计是准确的。
筛选步骤如下
7.0 插入一段关于“反对称矩阵”表达E的内容:
(以下的的下标错误,我就不改了,对应的是)
在上图中就有三条线:
第一条是Bob和Mike之间的三维平移向量(在Mike的坐标系下度量);
第二条是,由Mike指向建筑物的角点(在Mike坐标系下度量);
第三条是由Bob指向同一个角点,它在Mike的坐标系下定义为或者。
这样三条线可以组成一个平面,这个平面的法向量也很显而易见。和作叉乘,即可得到该平面的法向量。
当然法向量,以“矩阵”的角度看向量时,把转成对应的反对称矩阵与相乘即可。
这样的话,这个向量肯定垂直于该平面的法向量。
把它与平面法向量相乘结果为0,这样就可以得到一个等式(左上角所示)。对其进行整理化简,就可以写成第三行的形式。对于中间这部分,记为本质矩阵E。
8.0 三角化——恢复点的三维坐标——视图重建
- 实际上也是一个最小二乘问题
- 设定世界坐标系
- 已知:影像间彼此的相对旋转与平移
- 输出:通过两张及以上影像上二维坐标的对应关系,恢复该点的世界坐标系三维坐标。
实例
如上图所示,以第一张影像的坐标系为参考坐标系(世界坐标系),两个相机之间只发生了平移C,P1、P2为各自的投影矩阵。
根据上面的介绍,已知像素坐标和投影矩阵就可以构建系数矩阵A了。进而可以求解出该点三维坐标。准确的说是先求出了四维的齐次坐标,然后对最后一维归一化,归一化后向量的前三个分量即是要求的结果。
原理分析:
如上图所示3D点X通过投影矩阵P1变换到了像素坐标x1,相差尺度λ,表示从光心到该3D点的距离。
然后对等式两边进行操作,同乘以x1齐次坐标的叉乘,等式就为0(向量与其自身的叉乘为0向量)。
之所以要这样做是因为我们希望求解的是X,希望可以构建Ax=0形式的方程进而求解。而事实上这也是可以的,紫色部分即为系数矩阵A。这是通过一个视角获得的方程。
系数矩阵A——通过一个视角获得(至少需要两个方程)
对于多个视角,可以获得多个方程如上图所示。
每一个视角都可以一共一个这样的方程,多个方程叠加在一起一共构成一个系数矩阵A。
在实际操作中,根据点的像素坐标以及投影矩阵就可以构建出系数矩阵了。
这就是一个熟悉的最小二乘解方程问题,利用SVD对系数矩阵分解取V的最右边一列即可得到结果。此外需要注意的是系数矩阵的秩为2,所以至少需要两个方程才可以求解。
流程:
9.0 Python——稳健估计基础矩阵F
- https://blog.csdn.net/weixin_42557926/article/details/89359675
当存在噪声和不正确的匹配时,我们需要估计基础矩阵,我们采用 RANSAC 与 八点法 结合进行尝试:计算图像对的特征匹配,并估计基础矩阵;
原理:一个包含三幅图像的数据集,计算一对图像中三维点和照相机矩阵,匹配特征到剩下的图像中以获得对应。然后利用对应的三维点使用后方交汇法计算其他图像的照相机矩阵。
代码参考https://blog.csdn.net/weixin_42557926/article/details/89359675