标定的目的
想要利用视觉技术进行定位或测量,必然要知道由图像至现实物体的数学模型,而且也期望相机拍摄的图像能够准确的反应现实物体,然而现实物体经过镜头相机等元器件成像后并不能非常精准的成像,图像多少都会出现一些偏差,如何消除这些偏差呢,这就需要知道现实物体到图像的数学模型,即需要知道数学模型中的那些参数导致了图像发生变形,这样才能对其进行修正。综上所述,只要知道了相机的成像数学模型,就能对图像进行修正,就能反推出图像到现实物体的关系,这就是标定的目的,即获得相机的成像数学模型(其实标定相机就是为了确定相机内参)。
想要获得数学模型就要弄清楚,相机的成像过程发生了什么变化。人们在这个变化中定义了四个坐标系:世界坐标系、相机坐标系、图像坐标系和像素坐标系。物体经过这四个坐标系的变换以及镜头的畸变最终投影成图像。那么我们只要获得这四个坐标系之间的转换关系和畸变系数即得到了相机的数学模型。下面分别介绍四大坐标系和畸变系数。
四大坐标系
下图展示了四大坐标系,其中点P是世界坐标系中的一点。
世界坐标系: O W O_W OW、 X W X_W XW、 Y W Y_W YW、 Z W Z_W ZW,单位m。可以自由定义,这个说法我认为在初学者看来很奇怪,自由定义如何表示坐标呢,坐标系都不固定如何得到坐标值?在标定过程中是将标定板的平面定义为 X W X_W XW、 Y W Y_W YW且设 Z W = 0 Z_W=0 ZW=0,这样坐标值就固定了,但是这里依然很奇怪,世界坐标是随着标定板移动而移动的,虽然标定板上的坐标是确定的,但是虽然标定板的移动,图像上的像素坐标是变化的啊,这些没有基准的值对于求解模型有什么意义?世界坐标到相机坐标的转换即外参对于每张不同的标定图像是不一样的,这个外参不重要,变化不变化没关系,我们只是在构建求解相机模型过程中使用它得出了不变的内参和畸变系数。
相机坐标系: O C O_C OC、 X C X_C XC、 Y C Y_C YC、 Z C Z_C ZC,单位m。以摄像机光心为原点 O C O_C OC,光轴为 Z C Z_C ZC, Z C Z_C ZC正方向指向相机前方。
图像坐标系: o o o, x x x, y y y,单位mm。本来是在 O C O_C OC的后方 f f f(焦距)处,为了方便放到了 O C O_C OC前方f处。
像素坐标系: u u u, v v v,单位是像素,与图像坐标系在同一个平面,只是原点在图像的左上角。
为了解了四大坐标系,下面来介绍坐标系之间的转换。
世界坐标系至相机坐标系
世界坐标系至相机坐标系是一个刚体变换的过程即经过旋转和平移变换。假设空间中的一个点P在世界坐标系中表示为:
P
w
=
(
X
w
Y
w
Z
w
)
P_w=\left( \begin{array}{ccccc} X_w\\Y_w\\Z_w \end{array}\right)
Pw=⎝⎛XwYwZw⎠⎞
该点P在相机坐标系中的表示为:
P
c
=
(
X
c
Y
c
Z
c
)
P_c=\left( \begin{array}{ccccc} X_c\\Y_c\\Z_c \end{array}\right)
Pc=⎝⎛XcYcZc⎠⎞
那么想要将该点由世界坐标系变换至相机坐标系的话,需要先将其旋转一定角度再平移一段距离。那么旋转矩阵由
R
R
R表示,平移矩阵由
T
T
T表示,那么变换公式为
P
c
=
R
∗
P
w
+
T
P_c=R*P_w+T
Pc=R∗Pw+T,其中旋转矩阵
R
=
(
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
)
R=\left( \begin{array}{ccccc}r_{11}&r_{12}&r_{13}\\r_{21}&r_{22}&r_{23}\\r_{31}&r_{32}&r_{33}\end{array}\right)
R=⎝⎛r11r21r31r12r22r32r13r23r33⎠⎞,平移矩阵
T
=
(
t
1
t
2
t
3
)
T=\left(\begin{array}{ccccc}t_1\\t_2\\t_3\end{array}\right)
T=⎝⎛t1t2t3⎠⎞,在笛卡尔坐标系下变换公式如下所示:
P
c
=
(
r
11
r
12
r
13
r
21
r
22
r
23
r
31
r
32
r
33
)
P
w
+
(
t
1
t
2
t
3
)
P_c=\left(\begin{array}{ccccc}r_{11}&r_{12}&r_{13}\\r_{21}&r_{22}&r_{23}\\r_{31}&r_{32}&r_{33}\end{array}\right)P_w+\left(\begin{array}{ccccc}t_1\\t_2\\t_3\end{array}\right)
Pc=⎝⎛r11r21r31r12r22r32r13r23r33⎠⎞Pw+⎝⎛t1t2t3⎠⎞
如果使用齐次坐标,则可以将旋转和平移两个矩阵合并为一个矩阵,如下所示:
(
X
c
Y
c
Z
c
1
)
=
(
r
11
r
12
r
13
t
1
r
21
r
22
r
23
t
2
r
31
r
32
r
33
t
3
0
0
0
1
)
(
X
w
Y
w
Z
w
1
)
=
(
R
T
0
T
1
)
(
X
w
Y
w
Z
w
1
)
\left(\begin{array}{ccccc}X_c\\Y_c\\Z_c\\1\end{array}\right)=\left(\begin{array}{ccccc}r_{11}&r_{12}&r_{13}&t_1\\r_{21}&r_{22}&r_{23}&t_2\\r_{31}&r_{32}&r_{33}&t_3\\0&0&0&1\end{array}\right)\left(\begin{array}{ccccc}X_w\\Y_w\\Z_w\\1\end{array}\right)=\left(\begin{array}{ccccc}R&T\\0^T&1\end{array}\right)\left(\begin{array}{ccccc}X_w\\Y_w\\Z_w\\1\end{array}\right)
⎝⎜⎜⎛XcYcZc1⎠⎟⎟⎞=⎝⎜⎜⎛r11r21r310r12r22r320r13r23r330t1t2t31⎠⎟⎟⎞⎝⎜⎜⎛XwYwZw1⎠⎟⎟⎞=(R0TT1)⎝⎜⎜⎛XwYwZw1⎠⎟⎟⎞
相机坐标至图像坐标
相机坐标系和图像坐标系之间的关系图如下所示,其中空间一点 M M M在相机坐标系的坐标为 X c X_c Xc, Y c Y_c Yc, Z c Z_c Zc,在相机坐标系中的投影为点 m m m,坐标为 x x x, y y y。
根据三角形相似原理我们可以得到:
{
x
f
=
X
c
Z
c
y
f
=
Y
c
Z
c
⇒
{
Z
c
⋅
x
=
f
⋅
X
c
Z
c
⋅
y
=
f
⋅
Y
c
\left\{\begin{aligned}\frac xf=\frac {X_c}{Z_c}\\\frac yf=\frac {Y_c}{Z_c}\end{aligned}\right.\Rightarrow \left\{\begin{aligned}Z_c\cdot x=f\cdot X_c\\Z_c\cdot y=f\cdot {Y_c}\end{aligned}\right.
⎩⎪⎪⎨⎪⎪⎧fx=ZcXcfy=ZcYc⇒{Zc⋅x=f⋅XcZc⋅y=f⋅Yc
将上式用矩阵表示如下:
Z
c
(
x
y
1
)
=
(
f
0
0
0
0
f
0
0
0
0
1
0
)
(
X
c
Y
c
Z
c
1
)
Z_c\left(\begin{array}{ccccc}x\\y\\1\end{array}\right)=\left(\begin{array}{ccccc}f&0&0&0\\0&f&0&0\\0&0&1&0\end{array}\right)\left(\begin{array}{ccccc}X_c\\Y_c\\Z_c\\1\end{array}\right)
Zc⎝⎛xy1⎠⎞=⎝⎛f000f0001000⎠⎞⎝⎜⎜⎛XcYcZc1⎠⎟⎟⎞
图像坐标至像素坐标
图像坐标系和像素坐标系之间的关系图如下所示,两者是重合的,只是像素坐标系的中心在图像的左上角,且图像坐标系的单位是mm而像素坐标系的单位是像素。
根据上图可知图像坐标系和像素坐标系之间的转换其实就是单位的转换以及中心点偏移。图像中心的坐标是像素值
u
0
u_0
u0,
v
0
v_0
v0,假设图像上某点
p
(
x
,
y
)
p(x,y)
p(x,y)在像素坐标下表示为
p
(
u
,
v
)
p(u,v)
p(u,v),那么两只之间的转换公式如下所示,其中
d
x
,
d
y
dx,dy
dx,dy表示一个像素的大小即像元尺寸。
{
u
=
x
d
x
+
u
0
y
=
y
d
y
+
v
0
\left\{\begin{aligned}u=\frac {x}{dx}+u_0\\y=\frac {y}{dy}+v_0\end{aligned}\right.
⎩⎪⎨⎪⎧u=dxx+u0y=dyy+v0
将上式用矩阵表示如下:
(
u
v
1
)
=
(
1
d
x
0
u
0
0
1
d
y
v
0
0
0
1
)
(
x
y
1
)
\left(\begin{array}{ccccc}u\\v\\1\end{array}\right)=\left(\begin{array}{ccccc}\frac{1}{dx}&0&u_0\\0&\frac{1}{dy}&v_0\\0&0&1\end{array}\right)\left(\begin{array}{ccccc}x\\y\\1\end{array}\right)
⎝⎛uv1⎠⎞=⎝⎛dx1000dy10u0v01⎠⎞⎝⎛xy1⎠⎞
到这里四大坐标系之间的关系就介绍完了,其中世界坐标系到相机坐标系是相机模型的外参:
(
R
T
0
T
1
)
\left(\begin{array}{ccccc}R&T\\0^T&1\end{array}\right)
(R0TT1)
从相机坐标系再到像素坐标系是相机模型的内参,如下所示,其中
f
x
=
f
d
x
f_x=\frac {f}{dx}
fx=dxf,
f
y
=
f
d
y
f_y=\frac {f}{dy}
fy=dyf。
Z
c
(
u
v
1
)
=
(
1
d
x
0
u
0
0
1
d
y
v
0
0
0
1
)
(
f
0
0
0
0
f
0
0
0
0
1
0
)
(
X
c
Y
c
Z
c
1
)
=
(
f
x
0
u
0
0
0
f
y
v
0
0
0
0
1
0
)
(
X
c
Y
c
Z
c
1
)
Z_c\left(\begin{array}{ccccc}u\\v\\1\end{array}\right)=\left(\begin{array}{ccccc}\frac{1}{dx}&0&u_0\\0&\frac{1}{dy}&v_0\\0&0&1\end{array}\right)\left(\begin{array}{ccccc}f&0&0&0\\0&f&0&0\\0&0&1&0\end{array}\right)\left(\begin{array}{ccccc}X_c\\Y_c\\Z_c\\1\end{array}\right)=\left(\begin{array}{ccccc}f_x&0&u_0&0\\0&f_y&v_0&0\\0&0&1&0\end{array}\right)\left(\begin{array}{ccccc}X_c\\Y_c\\Z_c\\1\end{array}\right)
Zc⎝⎛uv1⎠⎞=⎝⎛dx1000dy10u0v01⎠⎞⎝⎛f000f0001000⎠⎞⎝⎜⎜⎛XcYcZc1⎠⎟⎟⎞=⎝⎛fx000fy0u0v01000⎠⎞⎝⎜⎜⎛XcYcZc1⎠⎟⎟⎞
这里或许还会有一个疑问,买来的相机和镜头已经知道它们的像元尺寸和焦距了,还需要通过标定求吗?我是这么理解的,因为制作工艺的原因,设备的规格参数不会完全等于给定的参数,因此需要通过标定获取更加精确的值。
畸变系数
相机模型除了上述的外参、内参还包括畸变系数,即现实物体经过镜头后会发生径向畸变和切向畸变。畸变系数的数学模型有除法模型和多项式模型,下面分别进行介绍。
径向畸变
径向畸变产生的原因是光线在远离镜头中心的位置比靠近中心的位置更加弯曲,这种畸变分为枕形畸变和桶形畸变,如下图所示:
径向畸变的多项式数学表达式如下所示,其中
k
1
,
k
2
,
k
3
k_1,k_2,k_3
k1,k2,k3就是径向畸变系数。
x
0
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
0
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
x_0=x(1+k_1r^2+k_2r^4+k_3r^6)\\y_0=y(1+k_1r^2+k_2r^4+k_3r^6)
x0=x(1+k1r2+k2r4+k3r6)y0=y(1+k1r2+k2r4+k3r6)
径向畸变的除法模型数学表达式如下所示,其中
k
k
k是畸变系数。
x
0
=
x
1
+
k
(
x
2
+
y
2
)
y
0
=
y
1
+
k
(
x
2
+
y
2
)
x_0=\frac {x}{1+k(x^2+y^2)}\\y_0=\frac {y}{1+k(x^2+y^2)}
x0=1+k(x2+y2)xy0=1+k(x2+y2)y
切向畸变
切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,其多项式数学表达式如下所示,切向畸变系数是
p
1
,
p
2
p_1,p_2
p1,p2.
x
0
=
x
+
[
2
p
1
y
+
p
2
(
r
2
+
2
x
2
)
]
y
0
=
y
+
[
2
p
2
x
+
p
1
(
r
2
+
2
y
2
)
]
x_0=x+[2p_1y+p_2(r^2+2x^2)]\\y_0=y+[2p_2x+p_1(r^2+2y^2)]
x0=x+[2p1y+p2(r2+2x2)]y0=y+[2p2x+p1(r2+2y2)]
切向畸变的除法数学模型没有找到介绍的资料
张正友标定法
通过上述的介绍,我们了解到相机模型的参数分为内参、外参和畸变系数。那么如何求出这些参数呢?张正友给出的方法是通过拍摄多张棋盘格标定板进行标定求解。假设世界坐标系的 x , y x,y x,y轴与标定板重合, z z z轴等于0,且该标定板的各个角点是已知的,拍摄的图片中的各个角点像素值也是已知的,通过这些数据即可以求出相机模型参数。这里不进行数学公式的罗列了,大概思路如下:
1.打印标定图案并粘贴至一个平面上,称之为标定板。
2.通过移动相机或移动标定板在不同的位姿拍摄多张标定板图像(图像数>=3)。
3.在所有图像上检测特征点(角点或者圆心点)。
4.使用闭合解法求解所有内参数和外参数。
5.通过线性方程组求解近似的畸变系数(或者直接赋值为0)。
6.通过非线性优化计算精确的内外参数和畸变系数。
其中的第4点闭合解也称为解析解,就是一些严格的公式,给出任意的自变量就可以求出其因变量,也就是问题的解。就是类似做数学题,利用条件和公式求解。这个求解的过程是没有考虑畸变系数的,因此这个解不是最终解,将其和第五点得到的近似畸变系数作为非线性优化的初始值再进一步求得最优解。因为求解相机模型是一个非线性优化的过程,所以合适的初始值非常重要,这样可以使得重复标定所得到的参数差距不会太大,也就是鲁棒性高。下面给出非线性优化的目标函数:
∑
i
=
1
n
∑
j
=
1
m
∥
m
i
j
−
m
′
(
A
,
k
1
,
k
2
,
R
i
,
t
i
,
M
j
)
∥
2
\sum_{i=1}^{n}\sum_{j=1}^{m}\begin{Vmatrix}m_{ij}-\mathop{m}\limits^\prime(A,k_1,k_2,R_i,t_i,M_j)\end{Vmatrix}^2
i=1∑nj=1∑m∥∥∥mij−m′(A,k1,k2,Ri,ti,Mj)∥∥∥2
上式中
i
i
i表示第
i
i
i张图片,
j
j
j表示第
i
i
i个图片中的第
j
j
j个角点,
m
i
j
m_{ij}
mij表示拍摄的图片的角点坐标,
m
′
(
A
,
k
1
,
k
2
,
R
i
,
t
i
,
M
j
)
\mathop{m}\limits^\prime(A,k_1,k_2,R_i,t_i,M_j)
m′(A,k1,k2,Ri,ti,Mj)表示标定板上的三维点使用求得的相机模型计算得到的角点坐标,两者之间的差值就是目标函数的物理意义。
在实际标定中,同一个相机每次标定的值也是不一样的,因为非线性优化求得的解不是唯一的,可能每次都接近理想值,但是都落在了附近的局部最优中。
张正友标定法最大的意义是通过简单的二维标定板求得闭合解,将世界坐标系定义在标定板上且Z=0,那么世界坐标系下的标定板变成了一个二维图像,它和像素坐标系中的图像之间的存在一个由单应性矩阵联系的变换,也存在一个由内外参联系的变换,单应性矩阵可以通过单张图像求得,那么拍摄多个标定板图像就可以获得多个单应性矩阵和内外参矩阵之间的关系,即获得了多个关于内外参的行列式,即可以确定内外参。这里只是简单说一下,其中有很多公式后续再补充。
总结
经过上述介绍,其实我们完成了单目相机的标定。双目相机除了需要求得各个相机的模型外还需要利用同时拍的标定图像求得两个相机之间的位姿关系 ( R , t ) (R,t) (R,t)。根据两相机之间的位姿关系才可以进行的极线校正,使得两幅图像的相同特征点在一条水平线上,目的是减少特征点的匹配搜索范围,进行特征点匹配后得出视差图,最后得出深度图生成点云数据。