齐次坐标与欧式坐标
在3D视觉中,一般都使用齐次坐标而不是欧式坐标(普通坐标),主要的原因是用齐次坐标可以线性表示坐标系的转换,而欧式坐标不行。
针孔成像模型
如下图是一个典型的针孔成像模型,它是研究照相机成像的一个既简单又有效的模型。
在实际研究中,由于像平面所成的像和真实物体方向相反,为了研究方便,一般直接研究虚拟像平面,虚拟像平面到针孔的距离也是焦距\(f\),虚拟像平面上的成像和真实物体方向一致,大小和像平面上一样。
四个坐标系
从真实物体到数字图像,经过了多种变换,空间中一个点是怎么转换到数字图像上的呢,这涉及到各个坐标系之间的转换。在成像过程中,主要涉及到以下四个坐标系:
世界坐标系:指的就是真实世界中的一个坐标系,单位是m,其中任意一点及其坐标表示为\(P_{w}=[X_{w}, Y_{w}, Z_{w}]^{T}\)。
相机坐标系:以光圈\(O\)为原点的右手坐标系(一般都是右手坐标系,当然也可以是左手),z轴一般与光轴重合(与成像平面垂直),单位为m,其中任意一点及其坐标表示为\(P_{c}=[X_{c}, Y_{c},Z_{c}]^{T}\)。
图像物理坐标系:就是虚拟成像平面上的坐标系,是一个二维坐标系,原点在虚拟成像平面中心,单位是mm,相当于是用物理单位来描述像素的位置,其上任意一点的坐标可表示为\(P=[x,y]^{T}\)。
像素平面坐标系,就是最后的数字图像上的二维坐标系,一般坐标原点在图像的左上角,单位是像素,从图像物理坐标系到像素平面坐标系,存在一个缩放和平移,其上任意一点的坐标表示为\(p=[u,v]^{T}\)。
四者的整体关系如下图所示:
坐标系之间的转换
从真实场景到数字图像,包含了多个坐标系的转换,下文依次叙述。
世界坐标系-->相机坐标系
这部分主要研究世界坐标系下的一点\(P_{w}\)到相机坐标系下一点\(P_{c}\)的转换关系。通过上面四个坐标系的关系图可以发现,这两个坐标系处于同一空间,只是位置不同,所以世界坐标系通过刚体运动就可以相机坐标系重合,这里的刚体运动即是指旋转和平移。其实这两个坐标系所表示的点都是空间上的同一个点,只是坐标不一样,而坐标按照刚体运动进行转换就可以了。
这里先看一下坐标系的旋转和平移对应点的坐标是如何变化的:
旋转
可以发现,世界坐标系可以沿着3个轴旋转,所以旋转有3个自由度,整个旋转过程可以拆分成分别绕轴旋转的三个过程,设世界坐标系中一点\(P\)旋转前的坐标为\([X_{0},Y_{0},Z_{0}]^{T}\),旋转后的坐标为\([X_{3},Y_{3},Z_{3}]^{T}\),绕X轴旋转过程见下图:
另外两个轴类似,设绕X轴、Y轴、Z轴旋转的旋转矩阵为\(R_{1}、R_{2}、R_{3}\),则:
\[\begin{bmatrix}
X_{1}\\
Y_{1}\\
Z_{1}
\end{bmatrix}
=\begin{bmatrix}
1& 0& 0\\
0& \cos\theta_{1}& \sin \theta_{1}\\
0& -\sin \theta_{1}&\cos\theta_{1}
\end{bmatrix}
\begin{bmatrix}
X_{0}\\
Y_{0}\\
Z_{0}
\end{bmatrix}
=R_{1}\begin{bmatrix}
X_{0}\\
Y_{0}\\
Z_{0}
\end{bmatrix}
\]
\[\begin{bmatrix}
X_{2}\\
Y_{2}\\
Z_{2}
\end{bmatrix}
=\begin{bmatrix}
\cos\theta_{2}& 0& -\sin \theta_{2}\\
0& 1& 0\\
\sin \theta_{2}& 0 &\cos\theta_{2}
\end{bmatrix}
\begin{bmatrix}
X_{1}\\
Y_{1}\\
Z_{1}
\end{bmatrix}
=R_{2}\begin{bmatrix}
X_{1}\\
Y_{1}\\
Z_{1}
\end{bmatrix}
\]
\[\begin{bmatrix}
X_{3}\\
Y_{3}\\
Z_{3}
\end{bmatrix}
=\begin{bmatrix}
\cos\theta_{3}& \sin \theta_{3}& 0\\
-\sin \theta_{3}& \cos\theta_{3}& 0\\
0& 0 &1
\end{bmatrix}
\begin{bmatrix}
X_{2}\\
Y_{2}\\
Z_{2}
\end{bmatrix}
=R_{3}\begin{bmatrix}
X_{2}\\
Y_{2}\\
Z_{2}
\end{bmatrix}
\]
其中的\(\theta_{1}、\theta_{2}、\theta_{3}\)也说明旋转一共有三个自由度,设总的旋转矩阵为\(R\),那么可得:
\[\begin{bmatrix}
X_{3}\\
Y_{3}\\
Z_{3}
\end{bmatrix}
=R_{3}R_{2}R_{1}\begin{bmatrix}
X_{0}\\
Y_{0}\\
Z_{0}
\end{bmatrix}
=R\begin{bmatrix}
X_{0}\\
Y_{0}\\
Z_{0}
\end{bmatrix}
\]
平移
设平移后的坐标为\([X_{4},Y_{4},Z_{4}]^{T}\),那么有
\[\begin{bmatrix}
X_{4}\\
Y_{4}\\
Z_{4}
\end{bmatrix}
=\begin{bmatrix}
X_{3}\\
Y_{3}\\
Z_{3}
\end{bmatrix}+\begin{bmatrix}
T_{x}\\
T_{y}\\
T_{z}
\end{bmatrix}
\]
其中\(T=[ T_{x}、T_{y}、T_{z}]^{T}\)分别表示旋转后的坐标系在\(xyz\)三个方向上的平移量。
总结
把旋转和平移结合在一起可得从世界坐标系到相机坐标系的坐标转换公式如下:
\[P_{c}=\begin{bmatrix}
X_{c}\\
Y_{c}\\
Z_{c}
\end{bmatrix}
=R\begin{bmatrix}
X_{w}\\
Y_{w}\\
Z_{w}
\end{bmatrix}+T
=\begin{bmatrix}
R&T
\end{bmatrix}\begin{bmatrix}
X_{w}\\
Y_{w}\\
Z_{w}
\end{bmatrix}
=\begin{bmatrix}
R&T
\end{bmatrix}P_{w}
\]
其中\(\begin{bmatrix}
R&T
\end{bmatrix}\)被称为相机的外参矩阵。
相机坐标系-->图像物理坐标系
这个转换呢,其实非常好理解,就是一个透视的关系,而实际运算过程中呢也就是利用三角形的相似性来进行计算的,首先看一下图:
由三角形相似理论,可得:
\[\left\{\begin{matrix}
\frac{x}{f}=\frac{X_{c}}{Z_{c}} \\
\frac{y}{f}=\frac{Y_{c}}{Z_{c}}
\end{matrix}\right.
==>
\left\{\begin{matrix}
x=f\frac{X_{c}}{Z_{c}} \\
y=f\frac{Y_{c}}{Z_{c}}
\end{matrix}\right.
\]
这一步最好的是要表示出\(P=[x,y]^{T}\)和\(P_{c}=[X_{c}, Y_{c},Z_{c}]^{T}\)的直接关系,由于维度上的差异,所以可以将\(P\)写成齐次坐标的形式,即:
\[\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
=\frac{1}{Z_{c}}\begin{bmatrix}
f& 0& 0\\
0& f& 0\\
0& 0& 1
\end{bmatrix}
\begin{bmatrix}
X_{c}\\
Y_{c}\\
Z_{c}
\end{bmatrix}
\]
图像物理坐标系-->像素坐标系
先看一下二者的位置关系,如下图:
第一眼看上去很正常的就认为这两个坐标系仅需要简单平移就能重合,即
\[\begin{bmatrix}
u\\v
\end{bmatrix}
=
\begin{bmatrix}
x\\y
\end{bmatrix}+
\begin{bmatrix}
c_{x}\\c_{y}
\end{bmatrix}
\]
其中\(c_{x}、c_{y}\)分别表示在xy两个方向上的平移量。
但其实上面的写法是错误的,因为这两个坐标系的单位不一样,一个是米,一个是像素,这两个坐标系之前其实还存在一个缩放(映射)关系,所以正确的公式应该是:
\[\begin{bmatrix}
u\\v
\end{bmatrix}
=
\begin{bmatrix}
kx\\ly
\end{bmatrix}+
\begin{bmatrix}
c_{x}\\c_{y}
\end{bmatrix}
\]
其中\(k、l\)表示的即是坐标系在两个方向上缩放的比例,一般情况下,\(k=l\),但也有时候它俩不相等。
同样为了得到\(p=[u,v]^{T}\)和\(P=[x,y]^{T}\)的直接关系,利用齐次坐标,有:
\[\begin{bmatrix}
u\\
v\\
1
\end{bmatrix}
=\begin{bmatrix}
k& 0& c_{x}\\
0& l& c_{y}\\
0& 0& 1
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
1
\end{bmatrix}
\]
世界坐标系-->像素坐标系
由前面的推导可以得到
\[\begin{bmatrix}
u\\
v\\
1
\end{bmatrix}
=\frac{1}{Z_{c}}\begin{bmatrix}
k& 0& c_{x}\\
0& l& c_{y}\\
0& 0& 1
\end{bmatrix}
\begin{bmatrix}
f& 0& 0\\
0& f& 0\\
0& 0& 1
\end{bmatrix}
\begin{bmatrix}
X_{c}\\
Y_{c}\\
Z_{c}
\end{bmatrix}
\]
于是有:
\[\begin{bmatrix}
u\\
v\\
1
\end{bmatrix}
=\frac{1}{Z_{c}}
\begin{bmatrix}
kf& 0& c_{x} \\
0& lf& c_{y} \\
0& 0& 1
\end{bmatrix}
\begin{bmatrix}
R&T
\end{bmatrix}
P_{w}
\]
令
\[K=\begin{bmatrix}
kf& 0& c_{x} \\
0& lf& c_{y} \\
0& 0& 1
\end{bmatrix}
\]
由于\(K\)中的元素都跟相机的内部属性有关,所以称\(K\)为相机的内参矩阵。对于一台相机,它的内参矩阵始终保持不变。
最后,可以写出世界坐标系-->像素坐标系的转换公式:
\[\begin{bmatrix}
p\\
1
\end{bmatrix}
=\frac{1}{Z_{c}}
K
\begin{bmatrix}
R&T
\end{bmatrix}
P_{w}
\]
注意到,式中有一项为\(\frac{1}{Z_{c}}\),根据定义,\(Z_{c}\)就是空间中一点到相机坐标系中心的距离,其实就是深度(depth),也就是我之前学习的单目深度估计算法中要求的那个深度。
对于深度信息丢失的理解
将世界坐标系到像素坐标系的转换公式改写,得到
\[p=K\frac{P_{c}}{Z_{c}}
\]
这是相机坐标系到像素坐标系的转换公式,如果把\(Z_{c}\)除进去(emmm不知道咋描述好),即
\[p=K\frac{P_{c}}{Z_{c}}=K\begin{bmatrix}
X_{c}/Z_{c}\\
Y_{c}/Z_{c}\\
1
\end{bmatrix}
\]
将\([X_{c}/Z_{c},Y_{c}/Z_{c},1]^{T}\)称为归一化坐标,该坐标就是相机前方\(Z=1\)的一个平面,将该平面称为归一化平面,归一化坐标左乘一个\(K\)就得到了\(p\),可以看出像素坐标其实是在归一化平面上量化采样得到的结果。
无论对相机坐标\(P_{c}\)数乘一个什么值,后边归一化都除掉了,对归一化坐标没有影响,而相机内参\(K\)又不变,所以对于\(p\)也没有影响。也就是说,不管\(Z_{c}\)有多大,对于投影过程都没有影响,所以可以理解为在投影过程中深度信息丢失了。