相机标定
相机标定目的
获取相机的内参和外参矩阵,同时也会得到每一副标定图像的旋转和平移矩阵。内参和外参可以对之后相机拍摄的图像进行矫正,得到畸变相对很小的图像。
原理
摄像机标定(Camera calibration)简单来说是从世界坐标系转换为相机坐标系,再由相机坐标系转换为图像坐标系的过程,也就是求最终的投影矩阵的过程。即:世界坐标系 --> 相机坐标系 --> 图像坐标系 --> 像素坐标系
世界坐标系(world coordinate system):用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入,单位为m。
相机坐标系(camera coordinate system):在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为连通世界坐标系和图像/像素坐标系的中间一环。单位为m。
图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标,单位为m。
像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。
世界坐标系到相机坐标系的转换
从世界坐标系转换到相机坐标系上属于刚体变换,即不会发生形变,也就是说只有旋转和平移。
设绕Z轴旋转角度为
θ
\theta
θ ,点
(
X
w
Y
w
Z
w
)
\begin{pmatrix} X_w&Y_w&Z_w\end{pmatrix}
(XwYwZw)为世界坐标系坐标,点
(
X
c
Y
c
Z
c
)
\begin{pmatrix} X_c&Y_c&Z_c\end{pmatrix}
(XcYcZc)为相机坐标系坐标,得(极坐标系下计算)
{
X
c
=
X
w
cos
θ
−
Y
w
sin
θ
Y
c
=
X
w
sin
θ
+
Y
w
cos
θ
Z
c
=
Z
w
\begin{cases} X_c=X_w\cos\theta-Y_w\sin\theta\\ Y_c=X_w\sin\theta+Y_w\cos\theta\\ Z_c=Z_w\end{cases}
⎩⎪⎨⎪⎧Xc=Xwcosθ−YwsinθYc=Xwsinθ+YwcosθZc=Zw
即:
[
X
c
Y
c
Z
c
]
=
[
cos
θ
−
sin
θ
0
sin
θ
cos
θ
0
0
0
1
]
⋅
[
X
w
Y
w
Z
w
]
=
R
1
[
X
w
Y
w
Z
w
]
\begin{bmatrix} X_c\\ Y_c \\Z_c\end{bmatrix}=\begin{bmatrix} \cos\theta& -\sin\theta&0\\ \sin\theta&\cos\theta&0\\0&0&1\end{bmatrix}\cdot\begin{bmatrix} X_w\\ Y_w \\Z_w\end{bmatrix}=R_1\begin{bmatrix} X_w\\ Y_w \\Z_w\end{bmatrix}
⎣⎡XcYcZc⎦⎤=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⋅⎣⎡XwYwZw⎦⎤=R1⎣⎡XwYwZw⎦⎤
设绕X轴旋转角度为
ϕ
\phi
ϕ,得
{
Y
c
=
Y
w
cos
ϕ
−
Z
w
sin
ϕ
Z
c
=
Y
w
sin
ϕ
+
Z
w
cos
ϕ
X
c
=
X
w
\begin{cases} Y_c=Y_w\cos\phi-Z_w\sin\phi\\ Z_c=Y_w\sin\phi+Z_w\cos\phi\\ X_c=X_w\end{cases}
⎩⎪⎨⎪⎧Yc=Ywcosϕ−ZwsinϕZc=Ywsinϕ+ZwcosϕXc=Xw
即:
[
X
c
Y
c
Z
c
]
=
[
1
0
0
0
c
o
s
ϕ
−
s
i
n
ϕ
0
sin
ϕ
cos
ϕ
]
⋅
[
X
w
Y
w
Z
w
]
=
R
2
[
X
w
Y
w
Z
w
]
\begin{bmatrix} X_c\\ Y_c \\Z_c\end{bmatrix}=\begin{bmatrix}1&0&0 \\ 0&cos\phi& -sin\phi \\ 0&\sin\phi&\cos\phi\end{bmatrix}\cdot\begin{bmatrix} X_w\\ Y_w \\Z_w\end{bmatrix}=R_2\begin{bmatrix} X_w\\ Y_w \\Z_w\end{bmatrix}
⎣⎡XcYcZc⎦⎤=⎣⎡1000cosϕsinϕ0−sinϕcosϕ⎦⎤⋅⎣⎡XwYwZw⎦⎤=R2⎣⎡XwYwZw⎦⎤
设绕Y轴旋转角度为
ω
\omega
ω,得
{
X
c
=
X
w
cos
ω
−
Z
w
sin
ω
Z
c
=
X
w
sin
ω
+
Z
w
cos
ω
Y
c
=
X
w
\begin{cases} X_c=X_w\cos\omega-Z_w\sin\omega\\ Z_c=X_w\sin\omega+Z_w\cos\omega\\ Y_c=X_w\end{cases}
⎩⎪⎨⎪⎧Xc=Xwcosω−ZwsinωZc=Xwsinω+ZwcosωYc=Xw
即:
[
X
c
Y
c
Z
c
]
=
[
cos
ω
0
−
sin
ω
0
1
0
sin
ω
0
cos
ω
]
⋅
[
X
w
Y
w
Z
w
]
=
R
3
[
X
w
Y
w
Z
w
]
\begin{bmatrix} X_c\\ Y_c \\Z_c\end{bmatrix}=\begin{bmatrix}\cos\omega&0& -\sin\omega \\ 0&1&0 \\ \sin\omega&0&\cos\omega\end{bmatrix}\cdot\begin{bmatrix} X_w\\ Y_w \\Z_w\end{bmatrix}=R_3\begin{bmatrix} X_w\\ Y_w \\Z_w\end{bmatrix}
⎣⎡XcYcZc⎦⎤=⎣⎡cosω0sinω010−sinω0cosω⎦⎤⋅⎣⎡XwYwZw⎦⎤=R3⎣⎡XwYwZw⎦⎤
故旋转矩阵为:
R
=
R
1
R
2
R
3
R=R_1R_2R_3
R=R1R2R3
偏移矩阵:
t
=
[
t
x
t
y
t
z
]
t=\begin{bmatrix}t_x \\ t_y \\t_z\end{bmatrix}
t=⎣⎡txtytz⎦⎤
即外参矩阵为(三维变四维为了将旋转与平移统一起来,方便计算):
[
R
3
×
3
t
3
×
1
0
T
1
]
\begin{bmatrix}R_{3\times3}&t_{3\times1}\\0^T&1\end{bmatrix}
[R3×30Tt3×11]
相机坐标系到图像坐标系的转换
针孔成像模型
因为有负号,不方便计算,于是将图像平面移到针孔平面与物体之间,使数学形式更简单。点
(
x
,
y
)
\begin{pmatrix}x,y\end{pmatrix}
(x,y)为图像坐标系坐标,点
(
X
c
,
Y
c
,
Z
c
)
\begin{pmatrix}X_c,Y_c,Z_c\end{pmatrix}
(Xc,Yc,Zc)为相机坐标系坐标,将焦距
f
f
f分成沿X轴和Y轴方向的两个焦距
f
x
f_x
fx和
f
y
f_y
fy
{
x
=
f
x
⋅
X
c
Z
c
y
=
f
x
⋅
Y
c
Z
c
\begin{cases}x=f_x\cdot \frac{X_c}{Z_c} \\ y=f_x\cdot\frac{Y_c}{Z_c}\end{cases}
{x=fx⋅ZcXcy=fx⋅ZcYc
设内参矩阵
K
K
K,相机坐标系
Q
(
X
c
,
Y
c
,
Z
c
)
Q\begin{pmatrix}X_c,Y_c,Z_c\end{pmatrix}
Q(Xc,Yc,Zc),投影图像坐标系
q
(
x
,
y
)
q\begin{pmatrix}x,y\end{pmatrix}
q(x,y)(二维变三维方便计算)
Z
c
[
x
y
1
]
=
[
f
x
0
0
0
f
y
0
0
0
1
]
⋅
[
X
c
Y
c
Z
c
]
=
[
f
x
X
c
f
y
Y
c
Z
c
]
Z_c\begin{bmatrix} x\\ y \\1\end{bmatrix}=\begin{bmatrix}f_x&0& 0 \\ 0&f_y&0 \\ 0&0&1\end{bmatrix}\cdot\begin{bmatrix} X_c\\ Y_c \\Z_c\end{bmatrix}=\begin{bmatrix} f_xX_c\\f_y Y_c \\Z_c\end{bmatrix}
Zc⎣⎡xy1⎦⎤=⎣⎡fx000fy0001⎦⎤⋅⎣⎡XcYcZc⎦⎤=⎣⎡fxXcfyYcZc⎦⎤
图像坐标系到像素坐标系的转换
像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点。图像坐标系的单位为mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这两者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,点(u,v)为像素坐标系上的点,对应的图像坐标系上的点为(x,y)。
{
u
=
x
d
x
+
u
0
v
=
y
d
y
+
v
0
\begin{cases}u=\frac{x}{dx}+u_0 \\ v=\frac{y}{dy}+v_0\end{cases}
{u=dxx+u0v=dyy+v0
[
u
v
1
]
=
[
1
d
x
0
u
0
0
1
d
y
v
0
0
0
1
]
[
x
y
1
]
\begin{bmatrix}u\\v\\1\end{bmatrix}=\begin{bmatrix}\frac{1}{dx}&0&u_0\\0&\frac{1}{dy}&v_0\\0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix}
⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡xy1⎦⎤
最终的转换关系
Z
c
[
u
v
1
]
=
[
1
d
x
0
u
0
0
1
d
y
v
0
0
0
1
]
[
f
x
0
0
0
f
y
0
0
0
1
]
⋅
[
R
3
×
3
t
3
×
1
0
T
1
]
⋅
[
X
w
Y
w
Z
w
1
]
Z_c\begin{bmatrix} u\\ v \\1\end{bmatrix}=\begin{bmatrix}\frac{1}{dx}&0&u_0\\0&\frac{1}{dy}&v_0\\0&0&1\end{bmatrix}\begin{bmatrix}f_x&0& 0 \\ 0&f_y&0 \\ 0&0&1\end{bmatrix}\cdot\begin{bmatrix}R_{3\times3}&t_{3\times1}\\0^T&1\end{bmatrix}\cdot\begin{bmatrix} X_w\\ Y_w \\Z_w\\1\end{bmatrix}
Zc⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡fx000fy0001⎦⎤⋅[R3×30Tt3×11]⋅⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤
即世界坐标
(
X
w
,
Y
w
,
Z
w
)
\begin{pmatrix}X_w,Y_w,Z_w\end{pmatrix}
(Xw,Yw,Zw)经旋转加平移变换为相机坐标
(
X
c
,
Y
c
,
Z
c
)
\begin{pmatrix}X_c,Y_c,Z_c\end{pmatrix}
(Xc,Yc,Zc),相机坐标
(
X
c
,
Y
c
,
Z
c
)
\begin{pmatrix}X_c,Y_c,Z_c\end{pmatrix}
(Xc,Yc,Zc)进行平面投影变换为图像坐标
(
x
,
y
)
\begin{pmatrix}x,y\end{pmatrix}
(x,y),图像坐标
(
x
,
y
)
\begin{pmatrix}x,y\end{pmatrix}
(x,y)最后转换为像素坐标
(
u
,
v
)
\begin{pmatrix}u,v\end{pmatrix}
(u,v)。
一个三维世界中的坐标点,可以在图像中找到一个对应的像素点。但是反过来,通过图像中的一个点找到它在三维中对应的点就很困难,因为我们并不知道等式左边的
Z
c
Z_c
Zc值。这个
Z
c
Z_c
Zc等于相机坐标系中相机到物体的距离。二维图像中的一个点,对应在三维空间中是一条线,因此如果不知道相机距被测物体距离,是无法从二维图像上的点推导出三维空间中某个点的坐标的。