一SfM介绍
SfM的全称为结构来自Motion,即通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。它与Kinect这种3D摄像头最大的不同在于,它只需要普通的RGB摄像头即可。
二小孔相机模型
在计算机视觉中,最常用的相机模型就是小孔模型(小孔成像模型),它将相机的透镜组简化为一个小孔,光线透过小孔在小孔后方的像面上成像,如下图所示。由上图可知,小孔模型成的是倒像,为了表述与研究的方便,我们常常将像面至于小孔之前,且到小孔的距离仍然是焦距女,这样的模型与原来的小孔模型是等价的,只不过成的是正像,符合人的直观感受。在这种情况下,往往将小孔称作光心(Optical Center)。
三坐标系
为了用数学研究SFM,我们需要坐标系。在SFM中主要有两类坐标系,一类为相机坐标系,一类为世界坐标系。
相机坐标系以相机的光心(小孔)作为原点, X轴为水平方向,Y轴为竖直方向,Z轴指向相机所观察的方向。
世界坐标系的原点可以任意选择,与相机的具体位置无关。内参矩阵:由上图可知,这是一个简单的相似三角形关系,从而得到 ,
设光心在图像上对应的像素坐标为(CX,CY),则
,
将以上关系表示为矩阵形式,有
称为内参矩阵,因为它只和相机自身的内部参数有关(焦距,光心位置)。
外参矩阵:
世界坐标系中的某一点P要投影到像面上时,先要将该点的坐标转换到相机坐标系下。
四相机的标定
五极线约束与本征矩阵
在三维重建前,我们先研究一下同一点在两个相机中的像的关系。假设在世界坐标系中有一点P,坐标为X,它在1相机中的像为X1,在2相机中的像为X2(注意X1和X2为齐次坐标,最后一个元素是1),如下图。
设两个相机具有相同的内参矩阵K,与世界坐标系之间的变换关系分别为[R1,T1]和[R2,T2],那么我们可以得到下面两个等式
由于ķ是可逆矩阵,两式左乘ķ逆,有
设 则有
由于世界坐标系可以任意选择,我们将世界坐标系选为第一个相机的相机坐标系,这时R1 = I,T1 = 0。上式则变为
将第一式带入第二式,有
和T2都是三维向量,它们做叉乘之后得到另外一个三维向量,该御姐向量垂直于和,再用该向量对等式两边做内积
即
令,有
可以看出,上式是同一点在两个相机中的像所满足的关系,它和点的空间坐标,点到相机的距离均没有关系,我们称之为极线约束,而矩阵ē则称为关于这两个相机的本征矩阵。如果我们知道两幅图像中的多个对应点(至少5对),则可以通过上式解出矩阵E,又由于è是由T2和R2构成的,可以从Ë中分解出T2和R2。
如何从Ë中分解出两个相机的相对变换关系(即T2和R2),OpenCV中为我们提供了解决方法。
六特征点的提取和匹配
从上面的分析可知,要求取两个相机的相对关系,需要两幅图像中的对应点,这就变成的特征点的提取和匹配问题。可以采用SIFT,SURF,ORB等特征提取方法。之后可以用Ratio Test或Cross Test(交叉验证)方法来排除错误。得到匹配点后,就可以使用OpenCV3.0中新加入的函数findEssentialMat()来求取本征矩阵了。得到本征矩阵后,再使用另一个函数对本征矩阵进行分解,并返回两相机之间的相对变换 - [R和T.注意这里的Ť是在第二个相机的坐标系下表示的,也就是说,其方向从第二个相机指向第一个相机(即世界坐标系所在的相机),且它的长度等于1。
七三维重建
现在已经知道了两个相机之间的变换矩阵,还有每一对匹配点的坐标。三维重建就是通过这些已知信息还原匹配点在空间当中的坐标。在前面的推导中,我们有 ,这个等式中目前还有两个未知量S2和X,可以用X2对等式两边做外积,可以消去S2,再化为齐次方程得
用SVD求X左边矩阵的零空间,再将最后一个元素归一化到1,即可求得X.其几何意义相当于分别从两个相机的光心作过X1和X2的延长线,延长线的焦点即为方程的解。由于这种方法和三角测距类似,因此这种重建方式也被称为三角化(三角测量).OpenCV提供了该方法,可以直接使用。接下来讲相机的个数推广到任意多个,成为一个真正的可持续森林管理系统。
八求第三个相机的变换矩阵
多目三维重建基于一个重要的假设:由前面的文章我们知道,两个相机之间的变换矩阵可以通过findEssentialMat以及recoverPose函数来实现,设第一个相机的坐标系为世界坐标系,现在加入第三幅图像(相机),如何确定第三个相机(后面称为相机三)到到世界坐标系的变换矩阵呢?用于多目重建的图像是有序的,即相邻图像的拍摄位置也是相邻的。
最简单的想法,就是沿用双目重建的方法,即在第三幅图像和第一幅图像之间提取特征点,然后调用findEssentialMat和recoverPose。但随着图像数量的增加,新加入的图像与第一幅图像的差异可能越来越大,特征点的提取变得异常困难,这时就不能再沿用双目重建的方法了。
而我们如果使用新加入的图像和相邻的图像进行特征匹配,就不能继续使用findEssentialMat和recoverPose来求相机的变换矩阵,因为它求取的是相对变换,而我们需要的是相机三到相机一的变换。
解决的办法是使用solvePnP和solvePnPRansac,函数根据空间中的点与图像中的点的对应关系,求解相机在空间中的位置。即已知空间中一些点的坐标,还知道这些点在图像中的像素坐标,那么函数就会求出相机在空间当中的坐标。两个函数的功能是相同的,只不过后者使用了RANSAC。
重建的过程是首先使用双目重建的方法,对头两幅图像进行重建,这样就得到了一些空间中的点,在加入了第三幅图像之后,使用第二幅图像与之进行特征点匹配