学习参考:https://www.cnblogs.com/wangguchangqing/p/8126333.html
slam十四讲
相机成像的过程实际是将真实的三维空间中的三维点映射到成像平面(二维空间)过程,可以简单的使用小孔成像模型来描述该过程,以了解成像过程中三维空间到二位图像空间的变换过程。
小孔成像模型
相机可以抽象为最简单的形式:一个小孔和一个成像平面,小孔位于成像平面和真实的三维场景之间,任何来自真实世界的光只有通过小孔才能到达成像平面。因此,在成像平面和通过小孔看到的真实三维场景存在着一种对应关系,也就是图像中的二维像点和真实三维世界的三维点存在某种变换关系。找到了这种变换关系,就可以利用图像中的二维点信息来恢复场景的三维信息。
如下图所示:
在描述小孔的成像过程前,首先我们先明确两个坐标系:
相机坐标系(三维坐标系):
相机的中心被称为焦点或者光心,以焦点
O
c
O_c
Oc为原点和坐标轴
X
c
,
Y
C
,
Z
c
X_c,Y_C,Z_c
Xc,YC,Zc组成了相机坐标系;
图像坐标系(二维坐标系):
成像平面中,以成像平面的中心
O
‘
O^`
O‘为原点和坐标轴
x
‘
,
y
‘
x^`,y^`
x‘,y‘组成了图像坐标系;
小孔成像实际就是将相机坐标系中的三维点变换到成像平面中的图像坐标系的二维点。
由上图,我们假设,三维空间中点P,其在相机坐标系中的坐标为
P
c
=
[
X
,
Y
,
Z
]
T
P_c=\begin{bmatrix}X,Y,Z\end{bmatrix}^T
Pc=[X,Y,Z]T;
那么在图像坐标系中
p
=
[
x
,
y
]
T
p=\begin{bmatrix}x,y\end{bmatrix}^T
p=[x,y]T,并且假设物理成像平面到小孔的距离为f(焦距)。那么,根据下图的三角形相似关系,有:
根据上图的三角关系我们可以得到:
将公式整理得:
以上公式就是小孔相机模型的基础公式。
内参数
相机的成像过程实际是将三维空间的点
P
=
(
X
,
Y
,
Z
)
P=(X,Y,Z)
P=(X,Y,Z)变换到成像平面的过程,这个过程也可以被称为射影变换。
总结一下描述:
- 射影变换的中心O作为相机坐标系的原点;
- 该点到成像平面的距离为f;
- P在成像平面的投影点为 p = ( x , y ) p=(x,y) p=(x,y);
以上得到小孔成像的基础公式。
这个公式描述了三维空间到二维平面的映射,但是该映射对于坐标Z来说却是非线性的。通过上面的公式方便的统一处理X,Y,Z这三个坐标轴的数据。此时需要用到齐次坐标的概念,扩展坐标的维度,将其线性化。
此时,我们可以使用矩阵乘法统一的处理X,Y,Z这个坐标了。
将x和y同时除以一个不为0的z,并且将z作为其添加维度的坐标,通常可以选择z=1;
有了前面的铺垫,我们来看一下相机内参:
相机内参有下面两部分组成:
- 射影变换本身的参数,相机的焦点到成像平面的距离,也就是焦距f;
- 从成像平面坐标系到像素坐标系的变换。我们上面推导使用的像点坐标p=(x,y)是成像平面坐标系下,以成像平面的中心为原点。而实际像素点的表示方法是以像素来描述,坐标原点通常是图像的左上角,X轴沿着水平方向向左,Y轴竖直向下。像素是一个矩形块,这里假设其在水平和竖直方向的长度分别为
α
\alpha
α和
β
\beta
β。所以像素坐标和成像平面坐标之间,相差了一个缩放和原点的平移。
假设像素坐标的水平方向的轴为 μ \mu μ,竖直方向的轴为 ν \nu ν,那么将一个成像平面的坐标(x,y)在水平方向上缩放 α \alpha α倍,在竖直方向缩放 β \beta β倍,同时平移 ( c x , c y ) (c_x,c_y) (cx,cy),就可以得到像素坐标 ( μ , ν ) (\mu,\nu) (μ,ν),其公式如下:
将上式求得的(x,y)带入上面公式得到:
将上面的公式改为齐次坐标的形式:
对于齐次坐标,缩放一个常量因子仍然是相等的,将Z挪到左边:
通过上面的推导,就得到了相机的内参数矩阵K:
K中有4个未知数和相机的构造相关,
f
x
,
f
y
f_x,f_y
fx,fy和相机的焦距,像素的大小有关;
c
x
,
c
y
c_x,c_y
cx,cy是平移的距离,和相机成像平面的大小有关。
求解相机内参数的过程被称为标定,在SLAM中可以假定相机的内参是已知的。
外参数
通过上面的推导,知道了相机成像的过程:
p = KP
其中,p是图像中像点的像素坐标,K是相机的内参数矩阵,P是相机坐标系下的三维坐标。
上面推导使用的三维点坐标是在相机坐标系下的,相机坐标系并不是一个“稳定”的坐标系,其会随着相机的移动而改变坐标的原点和各个坐标轴的方向,用该坐标系下坐标进行计算,显然不是一个明智的选择。需要引进一个稳定不变坐标系:世界坐标系,该坐标系是绝对不变,SLAM中的视觉里程计就是求解相机在世界坐标系下的运动轨迹。
设
P
c
P_c
Pc是
P
P
P在相机坐标系坐标,
P
w
P_w
Pw是其在世界坐标系下的坐标,可以使用一个旋转矩阵
R
R
R和一个平移向量
t
t
t,将
P
c
P_c
Pc变换为
P
w
P_w
Pw
P
c
=
R
P
w
+
t
P_c = RP_w+t
Pc=RPw+t
其中,
R
R
R是一个
3
x
3
3x3
3x3的旋转矩阵,
t
t
t是
3
x
1
3x1
3x1的平移向量,上面的运算的过程还需要做加法运算,为了方便计算,我们将其写为齐次坐标的形式:
我们将旋转矩阵
R
R
R和平移向量
t
t
t带入得:
上面就推导得到相机的外参数T:
内外参数组合
我们知道相机坐标到像素坐标的转换:
为了能够和外参数联合,我们将上式齐次化:
根据外参数公式,我们可以整理得:
将内外参组合到一起称为相机矩阵,其作用是将真实场景中的三维点投影到二维的成像平面。
总结起来:
我们目前已知的数据只有相机的内参和图像上的像素坐标。不知道相机的变换矩阵T,不知道相机坐标。因此在实际使用过程中,会根据不同情况进行化简。如用归一化相机坐标(Z=1)代替相机坐标,把第一帧的相机坐标当做世界坐标(T=单位阵)等。这样做虽然可以,但是就会有尺度损失的问题。这也对单目SLAM的尺度问题从原理上进行了解释。