没写完,但可看
------------------分割线----------------------
序
看了很多次相机标定,但都是看个模模糊糊,希望这次能够通过写blog掌握并精通与相机标定相关的知识。
备注:本篇文章适合复习/快速上手,不适合想弄懂相机标定原理的人
相机标定
背景
自从相机发明了后,我们能够使用相机将三维世界的场景以二维图像的形式保存下来,相机将三维场景中的信息转成二维图像的过程,引出了一个问题:能否通过计算模拟3D到2D的逆向过程。一旦这个问题解决了,那么就可以干很多事情了:图像畸变矫正、图像深度估计、三维重建等。而事实证明,该逆向过程是可以通过计算模拟的,计算的过程叫做相机标定
相机标定用数学模型模拟了三维场景到二维图像的逆向过程,为什么是模拟呢,因为我们只能将高维数据降维成低维数据,而无法用低维数据恢复高维数据。相机标定使用的技巧就是,利用视觉上的三维信息,计算二维图像转换成三维物体的参数
相机成像原理
坐标系说明
相机成像涉及到四个坐标系:世界坐标系、相机坐标系、成像坐标系、像素坐标系
-
世界坐标系
在世界坐标系中,只要世界中的物体没有发生移动,那么该物体在世界坐标系中的坐标是不会改变的。举个例子,前面空地有一个人和一台相机,人和相机都在世界坐标系下,只要人和相机没有发生位置移动,那么人和相机在世界坐标系下的坐标是不会发生改变的 -
相机坐标系
相机坐标系由相机的位置唯一确定,相机坐标系的三个维度由光心(相机坐标系原心)和过光心与投影平面平行的三个维度构成。还是上面的例子,假如前面空地有一个人和一台相机,如果人在世界中发生了位置的移动,那么在相机坐标系中,人的坐标发生变化,相机的位置是相机坐标系的原点;如果相机在世界中发生了位置的移动,但人没有动,那么在相机坐标系中,人的坐标仍然发生了变化,相机的位置(尽管是相机移动了)仍然是相机坐标系的原点。 -
成像坐标系
成像坐标系的原点是光轴与成像平面的交点,成像坐标系的x, y在成像平面上。这里的成像平面,已经是在相机内部了,但与像素坐标系有一定区别;并且成像坐标系的原点,在光轴上,也是相机透镜的物理中心。
光轴垂直于相机坐标系xy平面和成像坐标系xy平面,因此两个坐标系的z轴均在光轴上
- 像素坐标系
像素坐标系的原点即我们平时看到的图像的左上角。像素坐标系和成像坐标系的区别是,像素坐标系的原点在左上角,成像坐标系的原点在图像中心
成像流程
世界坐标系下的物体 —> 相机坐标系下的物体 —> 成像坐标系下的物体 —> 像素坐标系下的物体(即我们看到的图像中的物体)
世界坐标系→相机坐标系
世界坐标系和相机坐标是三维坐标系,一个物体在两个坐标系中均有长宽高的度量。
假定物体在世界坐标系下的坐标为 ( W x , W y , W z ) ({W}_{x}, {W}_{y}, {W}_{z}) (Wx,Wy,Wz),物体在相机坐标系下的坐标为 ( C x , C y , C z ) ({C}_{x}, {C}_{y}, {C}_{z}) (Cx,Cy,Cz),旋转矩阵为 R 3 × 3 {R}_{3\times3} R3×3,平移矩阵为 T 3 × 1 {T}_{3\times1} T3×1
那么物体从世界坐标映射到相机坐标系的过程应该是先平移,后旋转。
先将物体在世界坐标系下的坐标减去相机在世界坐标系下的坐标,获取到物体与相机的相对距离(如果能直接得到物体和相机的相对距离向量更好),然后再对物体的相对距离做旋转(如果物体是一个点,则直接用点的相对坐标乘以旋转矩阵;如果物体是由多个点构成的刚体,那么则用每个点的相对坐标乘以旋转矩阵)。整个先平移,后旋转的过程用数学公式表达可以写成:
[
C
x
C
y
C
z
1
]
=
[
R
0
0
1
]
×
[
E
−
T
0
1
]
×
[
W
x
W
y
W
z
1
]
\begin{bmatrix} {C}_{x} \\ {C}_{y} \\ {C}_{z} \\ 1 \end{bmatrix} = \begin{bmatrix} R & 0 \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} E & -T \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} {W}_{x} \\ {W}_{y} \\ {W}_{z} \\ 1 \end{bmatrix}
⎣⎢⎢⎡CxCyCz1⎦⎥⎥⎤=[R001]×[E0−T1]×⎣⎢⎢⎡WxWyWz1⎦⎥⎥⎤
其中 R R R和 T T T构成的分块矩阵 [ R T 0 1 ] \begin{bmatrix} R & T \\ 0 & 1 \end{bmatrix} [R0T1]是相机标定中提到的外参;暂时不用管矩阵值是什么,记住这个公式接着往下看
相机坐标系→成像坐标系
成像坐标系,顾名思义成像二字,很容易知道成像平面坐标系是二维的;此外,成像平面可以抽象地理解为相机内部的一个物理平面,该平面有相机观测到的外部三维世界的二维成像。
假定物体在相机坐标系下的坐标为
(
C
x
,
C
y
,
C
z
)
({C}_{x}, {C}_{y}, {C}_{z})
(Cx,Cy,Cz),成像后的物体在成像平面坐标系下的坐标为
(
G
x
,
G
y
)
({G}_{x}, {G}_{y})
(Gx,Gy),成像过程中涉及的相机焦距为
f
f
f,那么物体在三维世界中的坐标映射到相机成像平面的数学变换,可写作:
[
G
x
G
y
1
]
=
[
f
0
0
0
0
f
0
0
0
0
1
0
]
×
[
C
x
C
y
C
z
1
]
\begin{bmatrix} {G}_{x} \\ {G}_{y} \\ 1 \end{bmatrix} = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \times \begin{bmatrix} {C}_{x} \\ {C}_{y} \\ {C}_{z} \\ 1 \end{bmatrix}
⎣⎡GxGy1⎦⎤=⎣⎡f000f0001000⎦⎤×⎣⎢⎢⎡CxCyCz1⎦⎥⎥⎤
其中矩阵 [ f 0 0 0 0 f 0 0 0 0 1 0 ] \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} ⎣⎡f000f0001000⎦⎤是相机标定中提到的内参之一;这里的矩阵计算用到的原理包括小孔成像和相似三角形,具体细节见参考链接中的《相机成像原理》
成像坐标系→像素坐标系
假定物体在成像平面/成像坐标系下的坐标为 ( G x , G y ) ({G}_{x}, {G}_{y}) (Gx,Gy),物体在像素坐标系下的坐标为 ( P x , P y ) ({P}_{x}, {P}_{y}) (Px,Py),成像平面原点与像素平面原点之间在x方向和y方向的尺度距离为 ( o x , o y ) ({o}_{x}, {o}_{y}) (ox,oy),对应的尺度因子为 ( s x , s y ) ({s}_{x}, {s}_{y}) (sx,sy)
因为成像平面可以抽象理解为相机内部的一个物理平面,那么从物理平面的尺度转换到像素平面/图像尺度,所使用到的尺度缩放参数假定为 ( s x , s y ) ({s}_{x}, {s}_{y}) (sx,sy)
成像坐标系转换到像素坐标系,转换过程类似于一个点在二维平面上的平移,因此,这个平移过程可以写成:
P
x
=
1
s
x
G
x
+
o
x
{P}_{x} = \frac {1} {{s}_{x}} {G}_{x} + {o}_{x}
Px=sx1Gx+ox
P
y
=
1
s
y
G
y
+
o
y
{P}_{y} = \frac {1} {{s}_{y}} {G}_{y} + {o}_{y}
Py=sy1Gy+oy
写成矩阵运算的形式:
其中尺度距离 s s s与尺度因子 o o o是相机标定中提到的内参之一
总结
[
P
x
P
y
1
]
=
1
C
z
[
1
s
x
0
0
0
1
s
y
0
0
0
1
]
×
[
1
0
o
x
0
1
o
y
0
0
1
]
×
[
f
0
0
0
0
f
0
0
0
0
1
0
]
×
[
R
0
0
1
]
×
[
E
−
T
0
1
]
×
[
W
x
W
y
W
z
1
]
\begin{bmatrix} {P}_{x} \\ {P}_{y} \\ 1 \end{bmatrix} = \frac {1} {{C}_{z}} \begin{bmatrix} \frac {1} {{s}_{x}} & 0 & 0 \\ 0 & \frac {1} {{s}_{y}} & 0 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 1 & 0 & {o}_{x} \\ 0 & 1 & {o}_{y} \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \times \begin{bmatrix} R & 0 \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} E & -T \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} {W}_{x} \\ {W}_{y} \\ {W}_{z} \\ 1 \end{bmatrix}
⎣⎡PxPy1⎦⎤=Cz1⎣⎡sx1000sy10001⎦⎤×⎣⎡100010oxoy1⎦⎤×⎣⎡f000f0001000⎦⎤×[R001]×[E0−T1]×⎣⎢⎢⎡WxWyWz1⎦⎥⎥⎤
即:
[
P
x
P
y
1
]
=
1
C
z
[
1
s
x
0
0
0
1
s
y
0
0
0
1
]
×
[
f
0
o
x
0
0
f
o
y
0
0
0
1
0
]
×
[
R
0
0
1
]
×
[
E
−
T
0
1
]
×
[
W
x
W
y
W
z
1
]
\begin{bmatrix} {P}_{x} \\ {P}_{y} \\ 1 \end{bmatrix} = \frac {1} {{C}_{z}} \begin{bmatrix} \frac {1} {{s}_{x}} & 0 & 0 \\ 0 & \frac {1} {{s}_{y}} & 0 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} f & 0 & {o}_{x} & 0 \\ 0 & f &{o}_{y} & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \times \begin{bmatrix} R & 0 \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} E & -T \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} {W}_{x} \\ {W}_{y} \\ {W}_{z} \\ 1 \end{bmatrix}
⎣⎡PxPy1⎦⎤=Cz1⎣⎡sx1000sy10001⎦⎤×⎣⎡f000f0oxoy1000⎦⎤×[R001]×[E0−T1]×⎣⎢⎢⎡WxWyWz1⎦⎥⎥⎤
[ P x P y 1 ] = M × [ W x W y W z 1 ] \begin{bmatrix} {P}_{x} \\ {P}_{y} \\ 1 \end{bmatrix} = M \times \begin{bmatrix} {W}_{x} \\ {W}_{y} \\ {W}_{z} \\ 1 \end{bmatrix} ⎣⎡PxPy1⎦⎤=M×⎣⎢⎢⎡WxWyWz1⎦⎥⎥⎤
因此不管是在什么投影过程中,只需要弄懂从哪里到哪里的投影,直接使用上面对应的矩阵即可
相机畸变
背景
相机成像是通过透镜成像,而由于透镜的制造精度和组装工艺,成像会存在畸变,导致成像图片与我们视觉上看到的不同,存在扭曲
畸变类型主要分为两类:径向畸变和切向畸变。
径向畸变
径向畸变是沿着透镜中心向透镜平面展开的畸变,它产生的原因是光纤在透镜中心的地方比靠近中心的地方更加弯曲。径向畸变可分为枕型畸变和桶型畸变两种
切向畸变
切向畸变是由于透镜与成像平面不平行产生的,是有组装工艺导致的畸变误差
总之,我们一共需要五个畸变参数 ( k 1 , k 2 , k 3 , p 1 , p 2 ) ({k}_{1}, {k}_{2}, {k}_{3}, {p}_{1}, {p}_{2}) (k1,k2,k3,p1,p2)来描述相机产生的畸变,其中 k 1 , k 2 , k 3 {k}_{1}, {k}_{2}, {k}_{3} k1,k2,k3描述的是径向畸变的泰勒多项式参数,在这里取了前三阶; ( p 1 , p 2 ) ({p}_{1}, {p}_{2}) (p1,p2)描述的是切向畸变的修正。
相机标定方法
传统相机标定法
主要有:
- 基于3D立体靶标定法
- 基于2D平面靶标定法(张正友标定法)
- 基于径向约束的两步标定法(Tsai标定法)