学习SfM笔记

一SfM介绍


SfM的全称为结构来自Motion,即通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。它与Kinect这种3D摄像头最大的不同在于,它只需要普通的RGB摄像头即可。

二小孔相机模型

在计算机视觉中,最常用的相机模型就是小孔模型(小孔成像模型),它将相机的透镜组简化为一个小孔,光线透过小孔在小孔后方的像面上成像,如下图所示。由上图可知,小孔模型成的是倒像,为了表述与研究的方便,我们常常将像面至于小孔之前,且到小孔的距离仍然是焦距女,这样的模型与原来的小孔模型是等价的,只不过成的是正像,符合人的直观感受。在这种情况下,往往将小孔称作光心(Optical Center)。

 

三坐标系


为了用数学研究SFM,我们需要坐标系。在SFM中主要有两类坐标系,一类为相机坐标系,一类为世界坐标系。
相机坐标系以相机的光心(小孔)作为原点, X轴为水平方向,Y轴为竖直方向,Z轴指向相机所观察的方向。
世界坐标系的原点可以任意选择,与相机的具体位置无关。内参矩阵:由上图可知,这是一个简单的相似三角形关系,从而得到 




X = FX / ZY = FY / Z

设光心在图像上对应的像素坐标为(CX,CY),则

X = \压裂{FX} {Z} + C_ {X}Y = \压裂{FY} {Z} + C_ {Y}

将以上关系表示为矩阵形式,有 

Z \ begin {bmatrix} x \\ y \\ 1 \ end {bmatrix} = \ begin {bmatrix} f&0&c_ {x} \\ 0&f&c_ {y} \\ 0&01&\ end {bmatrix} \ begin {bmatrix} X \\ Y \\ Z \ end {bmatrix}

称为内参矩阵,因为它只和相机自身的内部参数有关(焦距,光心位置)。

外参矩阵:

世界坐标系中的某一点P要投影到像面上时,先要将该点的坐标转换到相机坐标系下。

四相机的标定 

 

五极线约束与本征矩阵 

 在三维重建前,我们先研究一下同一点在两个相机中的像的关系。假设在世界坐标系中有一点P,坐标为X,它在1相机中的像为X1,在2相机中的像为X2(注意X1和X2为齐次坐标,最后一个元素是1),如下图。

设两个相机具有相同的内参矩阵K,与世界坐标系之间的变换关系分别为[R1,T1]和[R2,T2],那么我们可以得到下面两个等式

S_ {1},X_ {1} = K(R_ {1} X + T_ {1}),

S_ {2} X_ {2} = K(R_ {2} X + T_ {2})

由于ķ是可逆矩阵,两式左乘ķ逆,有

S_ {1} K ^ { -  1} X_ {1} = R_ {1} X + T_ {1},

S_ {2} K ^ { -  1} X_ {2} = R_ {2} X + T_ {2}

K ^ { -  1} x_ {1} = x_ {1} ^ {'},K ^ { -  1} x_ {1} = x_ {2} ^ {'}, 则有

S_ {1},X_ {1} ^ {'} = R_ {1} X + T_ {1},

S_ {2} X_ {2} ^ {'} = R_ {2} X + T_ {2}

由于世界坐标系可以任意选择,我们将世界坐标系选为第一个相机的相机坐标系,这时R1 = I,T1 = 0。上式则变为 

S_ {1},X_ {1} ^ {'} = X,

S_ {2} X_ {2} ^ {'} = R_ {2} X + T_ {2}

将第一式带入第二式,有 

S_ {2} X_ {2} ^ { '} = S_ {1} R_ {2} X_ {1} ^ {'} + T_ {2}

X_ {2} ^ {'}和T_ {2}和T2都是三维向量,它们做叉乘之后得到另外一个三维向量T_ {2} \次x_ {2} ^ {'},该御姐向量垂直于X_ {2} ^ {'}和T_ {2}T_ {2},再用该向量对等式两边做内积

0 = s_ {1}(T_ {2} \次x_ {2} ^ {'})R_ {2} x_ {1} ^ {'}

0 = x_ {2} ^ {'}(R_ {2} \次T_ {2})x_ {1} ^ {'}

E = R_ {2} \次T_ {2},有 X_ {2} ^ { '} Ex_ {1} ^ {'} = 0

可以看出,上式是同一点在两个相机中的像所满足的关系,它和点的空间坐标,点到相机的距离均没有关系,我们称之为极线约束,而矩阵ē则称为关于这两个相机的本征矩阵。如果我们知道两幅图像中的多个对应点(至少5对),则可以通过上式解出矩阵E,又由于è是由T2和R2构成的,可以从Ë中分解出T2和R2。 
如何从Ë中分解出两个相机的相对变换关系(即T2和R2),OpenCV中为我们提供了解决方法。

六特征点的提取和匹配
 

从上面的分析可知,要求取两个相机的相对关系,需要两幅图像中的对应点,这就变成的特征点的提取和匹配问题。可以采用SIFT,SURF,ORB等特征提取方法。之后可以用Ratio Test或Cross Test(交叉验证)方法来排除错误。得到匹配点后,就可以使用OpenCV3.0中新加入的函数findEssentialMat()来求取本征矩阵了。得到本征矩阵后,再使用另一个函数对本征矩阵进行分解,并返回两相机之间的相对变换 - [R和T.注意这里的Ť是在第二个相机的坐标系下表示的,也就是说,其方向从第二个相机指向第一个相机(即世界坐标系所在的相机),且它的长度等于1。

七三维重建

现在已经知道了两个相机之间的变换矩阵,还有每一对匹配点的坐标。三维重建就是通过这些已知信息还原匹配点在空间当中的坐标。在前面的推导中,我们有  S_ {2} X_ {2} = K(R_ {2} X + T_ {2}),这个等式中目前还有两个未知量S2和X,可以用X2对等式两边做外积,可以消去S2,再化为齐次方程得

x_ {2} \次K \ begin {pmatrix} R_ {2}&T \ end {pmatrix} \ begin {pmatrix} X \\ 1 \ end {pmatrix} = 0

用SVD求X左边矩阵的零空间,再将最后一个元素归一化到1,即可求得X.其几何意义相当于分别从两个相机的光心作过X1和X2的延长线,延长线的焦点即为方程的解。由于这种方法和三角测距类似,因此这种重建方式也被称为三角化(三角测量).OpenCV提供了该方法,可以直接使用。接下来讲相机的个数推广到任意多个,成为一个真正的可持续森林管理系统。

八求第三个相机的变换矩阵
 

多目三维重建基于一个重要的假设:由前面的文章我们知道,两个相机之间的变换矩阵可以通过findEssentialMat以及recoverPose函数来实现,设第一个相机的坐标系为世界坐标系,现在加入第三幅图像(相机),如何确定第三个相机(后面称为相机三)到到世界坐标系的变换矩阵呢?用于多目重建的图像是有序的,即相邻图像的拍摄位置也是相邻的。

最简单的想法,就是沿用双目重建的方法,即在第三幅图像和第一幅图像之间提取特征点,然后调用findEssentialMat和recoverPose。但随着图像数量的增加,新加入的图像与第一幅图像的差异可能越来越大,特征点的提取变得异常困难,这时就不能再沿用双目重建的方法了
而我们如果使用新加入的图像和相邻的图像进行特征匹配,就不能继续使用findEssentialMat和recoverPose来求相机的变换矩阵,因为它求取的是相对变换,而我们需要的是相机三到相机一的变换

解决的办法是使用solvePnP和solvePnPRansac,函数根据空间中的点与图像中的点的对应关系,求解相机在空间中的位置。即已知空间中一些点的坐标,还知道这些点在图像中的像素坐标,那么函数就会求出相机在空间当中的坐标。两个函数的功能是相同的,只不过后者使用了RANSAC。

重建的过程是首先使用双目重建的方法,对头两幅图像进行重建,这样就得到了一些空间中的点,在加入了第三幅图像之后,使用第二幅图像与之进行特征点匹配

 

 

 

你可能感兴趣的:(SLAM)