前言
《十四讲》书中的顺序是李群、李代数,然后相机模型。
本篇调换一下顺序,首先讲相机模型和畸变原理。
针孔相机模型
针孔相机模型是最常用的相机模型。计算时,假设成像平面在相机前方。
对于相机坐标系下的一个点
P
=
(
X
,
Y
,
Z
)
P=(X,Y,Z)
P=(X,Y,Z),在物理成像平面上的坐标
P
′
P'
P′为
(
x
,
y
,
z
)
(x,y,z)
(x,y,z),根据相似三角形有:
x
X
=
y
Y
=
f
Z
x
=
f
X
Z
y
=
f
Y
Z
z
=
f
\frac{x}{X}=\frac{y}{Y}=\frac{f}{Z} \\ \quad \\ x=f\frac{X}{Z} \\ \quad \\ y=f\frac{Y}{Z} \\ \quad \\ z = f
Xx=Yy=Zfx=fZXy=fZYz=f
假设物理成像平面所在的位置为
z
=
1
z=1
z=1,则
P
′
=
(
X
/
Z
,
Y
/
Z
,
1
)
P'=(X/Z,Y/Z,1)
P′=(X/Z,Y/Z,1)
除了物理成像外,相机还需要对物理成像平面进行采样和量化,转化为像素。像素平面上,将物理像坐标放大
a
a
a倍后,再将物理像原点平移到图像的左上角:
u
=
a
x
x
+
c
x
v
=
a
y
y
+
c
y
即
u
=
f
x
X
Z
+
c
x
v
=
f
y
Y
Z
+
c
y
f
x
=
a
1
f
,
f
y
=
a
2
f
u=a_x x+c_x \\ v=a_yy+c_y \\ \quad \\ 即\\ \quad \\ u= f_x\frac{X}{Z}+c_x \\ \quad \\ v=f_y\frac{Y}{Z}+c_y \\ \quad \\ f_x=a_1f,f_y=a_2f
u=axx+cxv=ayy+cy即u=fxZX+cxv=fyZY+cyfx=a1f,fy=a2f
使用矩阵表示相机坐标到像素坐标模型:
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Z
Y
Z
1
]
=
1
Z
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
s
=
1
Z
K
P
\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix}= \begin{bmatrix} f_x & 0 &c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} \frac{X}{Z} \\ \frac{Y}{Z} \\ 1 \\ \end{bmatrix} =\frac{1}{Z} \begin{bmatrix} f_x & 0 &c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} X\\ Y \\ Z \\ \end{bmatrix} \\ \quad \\ s=\frac{1}{Z}KP
⎣⎡uv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡ZXZY1⎦⎤=Z1⎣⎡fx000fy0cxcy1⎦⎤⎣⎡XYZ⎦⎤s=Z1KP
K
K
K是相机内参,
P
P
P是相机坐标系上的点。可以将相机坐标转换到像素坐标的过程,看作是相机内参对相机坐标系平面
z
=
1
z=1
z=1上坐标的线性变换。通过光心与点
P
P
P的光线
P
O
PO
PO上的任意一点,都会投影到像素平面上的同一位置。这就是单目图像不能获取深度的原因。
现实场景中,首先要将世界坐标系下的点转换到相机坐标系下,然后再转换到像素平面上:
s
=
1
Z
K
T
c
w
P
w
s=\frac{1}{Z}KT_{cw}P_w
s=Z1KTcwPw
这里要注意
T
c
w
P
w
T_{cw}P_w
TcwPw将齐次的世界坐标
(
X
w
,
Y
w
,
Z
w
,
1
)
(X_w,Y_w,Z_w,1)
(Xw,Yw,Zw,1)转换到齐次的相机坐标
(
X
c
,
Y
c
,
Z
c
,
1
)
(X_c,Y_c,Z_c,1)
(Xc,Yc,Zc,1);然后要把齐次的相机坐标变为非齐次坐标
(
X
c
,
Y
c
,
Z
c
)
(X_c,Y_c,Z_c)
(Xc,Yc,Zc),并投影到
z
=
1
z=1
z=1的相机平面上
(
X
c
/
Z
,
Y
c
/
Z
,
1
)
(X_c/Z,Y_c/Z,1)
(Xc/Z,Yc/Z,1),再变换为齐次的像素坐标
(
u
,
y
,
1
)
(u,y,1)
(u,y,1)。
这里插一条齐次坐标的理解:对于三维世界的坐标 ( x , y , z ) (x,y,z) (x,y,z),为了使用矩阵简化平移计算,需要将坐标扩展到四维空间。而为了保证每个四维坐标都唯一对应三维空间的某个点,因此定义任意四维坐标 ( k x , k y , k z , k ) (kx,ky,kz,k) (kx,ky,kz,k)都表示三维空间中的 ( x , y , z ) (x,y,z) (x,y,z)。能够通过高维坐标表示低纬空间中的点,就是齐次坐标。
畸变原理
之前我写过一篇去畸变相关的博客,这里就直接复制了。
相机的镜头前有一块透镜,由于透镜的形状,当光线穿过透镜时,靠近光轴的光线折射比远离光轴的折射要小,就会产生径向畸变,此时真实世界中的直线在图像中会被弯曲,往外弯曲是枕形畸变,如下图(b),往里弯曲是桶形畸变,如下图(c)
由于透镜不可能完全与相机里的成像面平行,就会造成切向畸变
去畸变方法
假设归一化平面上的点P(x, y),可用极坐标(r, θ)表示,r就是P与归一化平面原点之间的距离,径向畸变就可以视为坐标点沿着距离方向发生改变,可以用畸变参数k1,k2,k3来修正;切向畸变可以看作坐标点的水平夹角发生改变。用多项式进行畸变拟合:
x
d
i
s
t
o
r
t
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
+
2
p
1
x
y
+
p
2
(
r
2
+
2
x
2
)
)
y
d
i
s
t
o
r
t
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
+
p
1
(
r
2
+
2
y
2
)
+
2
p
2
x
y
)
\\x_{distort} =x(1+k_1r^2+k_2r^4+k_3r^6+2p_1xy+p_2(r^2+2x^2))\\ \\y_{distort}=y(1+k_1r^2+k_2r^4+k_3r^6+p_1(r^2+2y^2)+2p_2xy)\\
xdistort=x(1+k1r2+k2r4+k3r6+2p1xy+p2(r2+2x2))ydistort=y(1+k1r2+k2r4+k3r6+p1(r2+2y2)+2p2xy)
将这些畸变后的点在像素平面上的坐标计算出来:
u
=
f
x
x
d
i
s
t
o
r
t
+
c
x
v
=
f
y
y
d
i
s
t
o
r
t
+
c
y
u=f_xx_{distort}+c_x\\ v=f_yy_{distort}+c_y\\
u=fxxdistort+cxv=fyydistort+cy
然后把畸变后的像素放回原本的位置,即去除了畸变。