之前看了一些三维坐标系转换的讲解,一直是一知半解模模糊糊,这周看完深蓝学院的讲解有了更深入的理解,下面来简单梳理一下。
三个坐标系
涉及到的坐标系有三个,世界坐标系,相机坐标系,像素坐标系。其中世界坐标系很好理解,它定义了三维物体的位置和方向。而相机坐标系的原点位于相机的中心投影点,它与相机的位置和拍摄方向相关,从不同的方向拍摄一个三维物体,每一个相机建立的相机坐标系都是不同的。像素坐标系也很好理解,对于相机拍摄得到的二维图像,以它的左下角为原点,以图像的宽和高方向建立坐标系,每一个像素都有一个坐标。那么三维重建的第一个步骤,就是要得到世界坐标系上的三维点和像素坐标系上点的对应关系,并由此来恢复物体的三维结构。
要得到三维点和像素点的对应关系,就要实现从世界坐标系到相机坐标系的转换,从相机坐标系到像素坐标系的转换,这里又会涉及到两个概念:相机内参和相机外参。
相机内参和相机外参
相机内参和相机外参是实现坐标系转换的关键。
摄像机内参表现的是摄像机坐标的三维点到像素的转换关系,由图片的EXIF信息生成。
摄像机外参(也称为位姿)表现的是世界坐标系上的点到摄像机坐标系上的转换关系,决定了摄像机在世界坐标系的哪个位置。由运动恢复结构获得,现在我们可以直接用colmap,metashape等软件获得。
相机坐标系到像素坐标系的转换(相机内参)
对于针孔相机模型来说,取jOk这个剖面为例,将直线OP和Op投影到这个剖面上,可以构建出一个相似三角形,根据相似三角形的对应比例关系可以得到y‘的值。
同理可以得到x’的值。但是这样得到的像平面坐标系是以图像中心为原点的,而一般像素平面是以左下角为原点,所以还要加上偏移量c_x和c_y,如下图:
你可能很奇怪这里出现的k和l又是什么?因为我们需要把连续的像平面离散成一个个像素,这个像素的转换比例就由k和l表示,即一个像素对应像平面的多少毫米。在现在的相机工业中k和l往往是相等的,通常将fk称为α,fl称为β。
现在我们就得到了摄像机坐标系上的点映射到像素平面的公式,但这并不是一个线性变换的过程,不便于计算,所以要通过齐次坐标引入线性形式,欧式变齐次,需要在最后加一个维度为1。齐次转欧式的话就是用第一维除以第三维,第二维除以第三维。三维点的齐次坐标和二维点的齐次坐标相差一个矩阵,矩阵中的参数是没有任何变化的,这个矩阵叫做投影矩阵:
取投影矩阵的前三列就是相机内参数矩阵。
世界坐标系到相机坐标系的转换(相机外参)
这个转换主要靠旋转矩阵R和平移向量t完成
P
c
=
R
P
w
+
t
P
c
是相机坐标系
P
w
是世界坐标系
P_c = RP_w+t\\P_c是相机坐标系\\P_w是世界坐标系
Pc=RPw+tPc是相机坐标系Pw是世界坐标系
用齐次坐标表示就是:
R、t组成的矩阵是相机外参数矩阵,再乘上相机内参矩阵K,就实现了世界坐标系到像素平面的坐标转换。
具体的维度信息:
运动恢复结构
那么相机外参(位姿)如何获得呢,虽然可以通过colmap软件直接得到位姿信息,但是大致的原理还是要了解。
运动恢复结构(sfm)指通过某个场景的多张图像恢复该场景的三维结构信息和每张图片对应的相机参数(位姿),得到的是稀疏点云。这实际上就是传统三维重建的第一个步骤,在NeRF中也是需要这一步的,NeRF实际上是替代了后面的表面重建和纹理贴图的环节。
即已知n个三维点在m张图像中对应的像素坐标,要求解m个摄像机的投影矩阵和n个三维点的坐标,这是运动恢复结构中的欧式结构恢复。
这里就要引入三角化和极几何的概念,这里只是简单介绍一下,如果有需要可以具体去学习。
三角化
单目无法获取深度信息,如果有一个点p的相机内外参,我们能知道P在某一条确定的直线上,但不能确定它的深度,在直线的哪个位置,当我们拥有两张视图的时候,两条射线相交于一点,就可以确定点P的三维坐标,注意这里两个坐标系要转换到一个坐标系才会出现射线交点。下图中的O1和O2是世界坐标系。
但是由于噪声的存在,两条直线通常是不相交的。要求解点P坐标有线性法和非线性法。线性法就是列出点P通过两套相机坐标系映射到像素点p和p‘的方程组,解奇异值矩阵得到点P。非线性法就是选取一个世界坐标系的点P*,然后去计算MP*和p点的距离,寻找误差的最小化,误差越小,找到的P*越好。
已知p、p’、K、K’、和R、T,求解P点的过程,就叫做三角化。
极几何
通常R、T的值是未知的,那么已知已知p、p’、K、K’,如何求解R、T和P点的三维坐标?
极几何描述的就是同一场景或物体两个视点图像之间的关系,用本质矩阵来描述,在本质矩阵的基础上得到基础矩阵F。
最终的求解步骤是先用极几何知识求解出R、T,再用三角化求解:
可以分别对每一对图像计算运动与结构,但容易出现误差累积。
还有一种方法是捆绑调整法,全部的点一起调整,先给未知的Mi一个初值,可以投影到红色的重构点,把投影在像平面的所有红色点的差值累加起来,总误差越小,求得的值越符合真实情况。(有很多梯度下降的求解方法)