因为工作和学习的需要,最近开始接触三维重建的相关知识。所以尽量在自己每学习一段内容后进行一下总结和归纳,方便以后查看顺便和大家进行交流。
首先总结一下相机标定方面,一下所说的相机标定是在世界坐标、相机坐标、成像平面坐标、物理坐标平面等等之间的关系以及方法介绍和一些相关概念的解读。而有关相机标定的一些相关算法,包括张正友等各种标定算法在以后的博客中在慢慢写吧。
首先介绍一下几个坐标系,上文也提到了包括世界坐标系、相机坐标系、归一化像平面的坐标系和物理图像上的坐标系等,还有本文提到的坐标系一般是基于右手坐标系,如果哪位老铁骨骼清奇非使用左手坐标系也无所谓,自己照着原理改一下就好。
之前提到的坐标系各自是一个整体,但是在我们常用的一个物体的像到相机中的图像的过程中,其实是有一定顺序的。下面为方便理解,按一定顺序进行介绍。
(一)世界坐标系到相机坐标系
我们使用
X
w
=
(
x
w
y
w
z
w
)
{X_w} = \left( \begin{array}{l} {x_w}\\ {y_w}\\ {z_w} \end{array} \right)
Xw=⎝⎛xwywzw⎠⎞表示某个点
X
X
X在世界坐标系中的位置坐标,用
X
c
=
(
x
c
y
c
z
c
)
{X_c} = \left( \begin{array}{l} {x_c}\\ {y_c}\\ {z_c} \end{array} \right)
Xc=⎝⎛xcyczc⎠⎞表示这个点在相机坐标系中的坐标。其实从世界坐标系到相机坐标系是一个刚体变换的过程,也就是世界坐标系中的这个物体点经过一些旋转和平移变换是一定能变换到相机坐标系中的。当相机在某一位置固定时,这个旋转
R
R
R和平移
T
T
T两个参数就是与其相对应的。
世界坐标系到相机坐标系的变换:
X
c
=
R
X
w
+
T
{X_c} = R{X_w} + T
Xc=RXw+T
换成齐次方式就是:
[
X
c
1
]
=
[
R
T
0
T
1
]
[
X
w
1
]
\ {\begin{bmatrix} {{X_c}}\\ 1 \end{bmatrix}} \ = \ {\begin{bmatrix} R&T\\ {{0^T}}&1 \end{bmatrix}} \ {\begin{bmatrix} {{X_w}}\\ 1 \end{bmatrix}}
[Xc1] = [R0TT1] [Xw1]
反之,逆变换为:
X
w
=
R
T
X
c
−
R
T
T
{X_w} = {R^T}{X_c} - {R^T}T
Xw=RTXc−RTT
齐次式形式为:
[
X
w
1
]
=
[
R
T
−
R
T
T
0
T
1
]
[
X
c
1
]
\ {\begin{bmatrix} {{X_w}}\\ 1 \end{bmatrix}} \ = \ {\begin{bmatrix} {{R^T}}&{ - {R^T}T}\\ {{0^T}}&1 \end{bmatrix}} \ {\begin{bmatrix} {{X_c}}\\ 1 \end{bmatrix}}
[Xw1] = [RT0T−RTT1] [Xc1]
在相机坐标系中,相机中心是其中的原点坐标,根据以上的公式我们可以计算出相机中心在世界坐标系中的坐标为:
O
c
a
m
e
r
a
w
=
R
T
O
c
a
m
e
r
a
c
−
R
T
T
=
−
R
T
T
O_{camera}^w = {R^T}O_{camera}^c - {R^T}T = - {R^T}T
Ocameraw=RTOcamerac−RTT=−RTT那么在相机坐标系中,z轴方向为正对成像方向,那么我们的z轴向量在世界坐标系中又怎么表达呢?我们假设是个单位向量,即
Z
c
=
(
0
0
1
)
{Z^c} = \left( \begin{array}{l} 0\\ 0\\ 1 \end{array} \right)
Zc=⎝⎛001⎠⎞: 那么这个单位向量
r
r
r表示为:
r
c
=
Z
c
−
O
c
a
m
e
r
a
c
{r^c} = {Z^c} - O_{camera}^c
rc=Zc−Ocamerac此时向量在世界坐标系中的位置为:
r
w
=
(
R
T
Z
c
−
R
T
T
)
−
(
R
T
O
c
a
m
e
r
a
c
−
R
T
T
)
{r^w} = \left( {{R^T}{Z^c} - {R^T}T} \right) - \left( {{R^T}O_{camera}^c - {R^T}T} \right)
rw=(RTZc−RTT)−(RTOcamerac−RTT)进行展开得到:
r
w
=
R
T
(
0
0
1
)
=
R
(
3
,
:
)
{r^w} = {R^T}\left( {\begin{array}{} 0\\ 0\\ 1 \end{array}} \right) = R(3,:)
rw=RT⎝⎛001⎠⎞=R(3,:)也就是旋转R矩阵中的第三行。可以看出对于相机的成像方向
z
z
z的变换是个平移量无关的。
(二)相机坐标系到归一化像平面
如图所示,我们的到了相机中成像在相机中的位置坐标,但是此坐标是由相机的一些参数决定的,比如其焦距f等,所以我们为了统一标准和以后方便计算,将相机坐标系中的位置坐标再换算到与其成像平面平行且距离相机原点单位距离的平面,也把这个平面叫做归一化相平面。
这就很好理解了吧,我们相机的成像平面一定是与其焦距f有关的,我们通过相似定理就能计算出在归一化相平面内点的坐标值。也就是说这个过程其实我们是将三维空间点开始向二维空间点进行转化,在之后的计算中涉及到归一化相平面或者物理像平面内的坐标点更多的是代表空间中的一条射线。因为我们在之前的已经失去这个点的三维信息,当然,后期我们也将会通过多相机的方式对点进行三维重建。
(三)归一化像平面到物理像平面
物理相平面其实说的是我们相机传感器芯片所在的平面,也就是我们相机成像的平面。
对于物理像平面坐标系中的图像,它是以图像的左上角为原点,而我们之前的归一化相平面坐标系中是一成像中心点为原点,因此变换后的图像像素点坐标值变换公式为:
此时做个总结就是在整个过程,即从世界坐标系中的一点坐标变换到物理成像平面坐标系中坐标过程:
其中的
K
K
K我们一般可以称之为内参矩阵,因为其中大部分参数都是相机的内部参数,受外界影响较小(我们做高精度重建时一定会对其再校正),而
R
T
RT
RT参数则称之为外参。
其中外参参数有6个,对应在
R
T
RT
RT矩阵中,内参参数有5个分别是
f
a
=
f
b
f_a=f_b
fa=fb,
k
1
k_1
k1,
k
2
k_2
k2,
u
0
u_0
u0,
v
0
v_0
v0。一般情况,我们把求外参的过程叫做相机的姿态估计,而求内参的过程叫做相机标定。
(四)径向畸变
对于
k
1
k_1
k1,
k
2
k_2
k2 主要是作为处理相机的径向畸变所使用到的参数,因为我们的相机成像一般是难以达到理想情况的,因此在距离图像中心点越处越容易发生一些畸变。
此时我们进行一些带入与换算:
那我们怎么对其进行校正呢?我们将矫正后图像某一位置坐标通过上述公式像校正前进行变换,由于像素点为离散数据,我们需要通过插值法对校正前图像的对应值进行采样。这样我们就得到了矫正后图像个像素点的像素值。