【3D视觉学习笔记1】针孔相机模型与坐标系变换
本系列笔记是北邮鲁老师三维重建课程笔记,视频可在B站找到。
1. 若干典型摄像机模型
D:\OneDrive\学习资料_研\笔记\3DVision\images
1.1 针孔摄像机
1.1.1 基本模型
我们考虑相机坐标系和成像平面坐标系的关系。我们考虑RDF坐标系,即x轴是Right,y轴是Down,z轴是Forward。而且,我们将成像平面放在虚平面上,这样是为了方便计算。虚平面到原点的距离即为焦距,如图所示。
相机外一个点P,经过小孔O,映射到像素平面的点P’. 焦距 f f f就是从小孔到成像平面(像素平面)的距离。假设P在相机平面的坐标为 [ x , y , z ] [x,y,z] [x,y,z], 利用相似三角形法,我们求解它在像素平面的坐标 [ x ′ , y ′ ] [x', y'] [x′,y′].
我们先看
x
′
x'
x′的求解。从俯视角度看,在
x
O
z
xOz
xOz平面,立即得到
z
x
=
f
x
′
\frac{z}{x}=\frac{f}{x'}
xz=x′f
得到
x
′
=
f
x
z
x' = f\frac{x}{z}
x′=fzx. 类似地,我们从
y
O
z
yOz
yOz平面,可以得到
y
z
=
y
′
f
→
y
′
=
f
y
z
\frac{y}{z} = \frac{y'}{f} \to y' = f \frac{y}{z}
zy=fy′→y′=fzy.
1.1.2 成像坐标系、相机坐标系和世界坐标系的转换
我们在2D视觉中,一般习惯把成像平面左上角的点当作原点。所以我们要对上面求解的坐标加一个偏置。假设像平面中心坐标为
[
c
x
,
c
y
]
[cx, cy]
[cx,cy], 则:
x
′
=
c
x
+
f
x
z
y
′
=
c
y
+
f
y
z
x' = c_x + f\frac{x}{z} \\ y' = c_y + f\frac{y}{z}
x′=cx+fzxy′=cy+fzy
但是!有没有发现上面的公式有一个问题。点在相机坐标系下的单位是距离单位(比如米),而在成像平面,坐标指的是像素。所以,左右两边量纲对不上。所以我们需要一个常数来修正两边的量纲:
x
′
=
c
x
+
f
k
x
z
y
′
=
c
y
+
f
l
y
z
x' = c_x + fk\frac{x}{z} \\ y' = c_y + fl\frac{y}{z}
x′=cx+fkzxy′=cy+flzy
k
,
l
k, l
k,l的单位是
m
/
p
i
x
e
l
m/pixel
m/pixel, 是跟相机性质有关的参数。 既然如此,我们令
α
=
f
k
,
β
=
f
l
\alpha = fk, \beta = fl
α=fk,β=fl, 那么
x
′
=
c
x
+
α
x
z
y
′
=
c
y
+
β
y
z
x' = c_x + \alpha\frac{x}{z} \\ y' = c_y + \beta\frac{y}{z}
x′=cx+αzxy′=cy+βzy
然后我们又发现了一个问题,实际上
x
′
x'
x′与
x
x
x,
y
′
y'
y′与
y
y
y的关系并不是线性的,因为分母还有个
z
z
z,它也是个变量。怎么办?我们引入齐次坐标,让坐标表示增加一个维数,从而使得形式成为线性的。
齐次坐标说明:如果给定坐标 [ x , y , z ] T [x, y, z]^T [x,y,z]T, 齐次形式为 [ x , y , z , 1 ] T [x, y, z, 1]^T [x,y,z,1]T. 同样,如果给定齐次坐标 [ x , y , w ] T [x, y, w]^T [x,y,w]T, 可以反推出原始的坐标是 [ x / w , y / w ] T [x/w, y/w]^T [x/w,y/w]T.
然后我们可以愉快的写出:
[
x
′
,
y
′
]
T
∼
[
x
′
z
,
y
′
z
,
z
]
T
=
[
α
x
+
c
x
z
,
β
y
+
c
y
z
,
z
]
T
=
[
α
0
c
x
0
0
β
c
y
0
0
0
1
0
]
[
x
y
z
1
]
[x', y']^T \sim [x'z, y'z, z]^T = [\alpha x + c_x z, \beta y + c_y z, z]^T = \begin{bmatrix} \alpha & 0 & c_x & 0 \\ 0 & \beta & c_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}
[x′,y′]T∼[x′z,y′z,z]T=[αx+cxz,βy+cyz,z]T=
α000β0cxcy1000
xyz1
记相机的内参矩阵为:
K
=
[
α
0
c
x
0
β
c
y
0
0
1
]
K = \begin{bmatrix} \alpha & 0 & c_x \\ 0 & \beta & c_y \\ 0 & 0 & 1 \end{bmatrix}
K=
α000β0cxcy1
所以
[
α
x
+
c
x
z
β
y
+
c
y
z
z
]
=
K
[
I
3
×
3
,
0
]
[
x
y
z
1
]
\begin{bmatrix} \alpha x + c_x z \\ \beta y + c_y z \\ z \end{bmatrix} = K[I_{3\times 3}, 0] \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}
αx+cxzβy+cyzz
=K[I3×3,0]
xyz1
我们再来想,相机坐标系和世界坐标系的关系。这两个都是三维坐标系,而坐标系之间的变换可以由旋转和平移描述。对于三维坐标系,旋转矩阵为
R
R
R, 是3x3矩阵,平移矩阵为
T
T
T, 是3x1矩阵。所以对于世界坐标系中某点
[
x
w
,
y
w
,
z
w
,
1
]
[x_w,y_w,z_w,1]
[xw,yw,zw,1], 投影到相机坐标系为
P
=
[
R
T
0
1
]
[
x
w
y
w
z
w
1
]
P = \begin{bmatrix} R & T \\ 0 &1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix}
P=[R0T1]
xwywzw1
所以,从世界坐标系——相机坐标系——成像平面的映射过程为
P
i
m
g
=
K
[
I
,
0
]
P
c
a
m
=
K
[
I
,
0
]
[
R
T
0
1
]
P
w
o
r
l
d
=
K
[
R
,
T
]
P
w
o
r
l
d
P_{img} = K[I, 0]P_{cam} = K[I, 0] \begin{bmatrix} R & T \\ 0 &1 \end{bmatrix} P_{world} = K[R, T]P_{world}
Pimg=K[I,0]Pcam=K[I,0][R0T1]Pworld=K[R,T]Pworld
其中的
[
R
,
T
]
[R,T]
[R,T]就称为外参矩阵。
所以,令
M
=
K
[
R
,
T
]
=
[
m
1
m
2
m
3
]
M = K[R, T] = \begin{bmatrix} m_1 \\ m_2 \\ m_3 \end{bmatrix}
M=K[R,T]=
m1m2m3
其中
m
i
∈
R
4
m_i \in \mathbb{R}^4
mi∈R4, 那么像平面上坐标为
[
m
1
P
w
o
r
l
d
m
3
P
w
o
r
l
d
,
m
2
P
w
o
r
l
d
m
3
P
w
o
r
l
d
]
[\frac{m_1 P_{world}}{m_3 P_{world}}, \frac{m_2 P_{world}}{m_3 P_{world}}]
[m3Pworldm1Pworld,m3Pworldm2Pworld]
对于
M
M
M自由度的讨论:内参矩阵
K
K
K有5个自由度(除了
α
,
β
,
c
x
,
c
y
\alpha, \beta, c_x, c_y
α,β,cx,cy, 还有一个像素平面的夹角
θ
\theta
θ. 与镜头工艺有关),外参矩阵有6个自由度(三个旋转+三个平移),所以一共11个自由度。
下面介绍一个数学形式上更简单的模型:弱透视投影摄像机
当物体距离相机比较远,且物体较小或者比较平,此时,物体上各点相对相机的距离的变化可以忽略。所以,我们可以近似的认为物体上各点都位于一个平面上。因此,世界坐标中的
z
z
z就是一个定值
z
0
z_0
z0. 此时原本的
x
′
=
c
x
+
α
x
z
x' = c_x + \alpha\frac{x}{z}
x′=cx+αzx中的系数
α
/
z
\alpha / z
α/z就变成了常数,因此从世界坐标系到像坐标系就完全是线性变换了,而不是透视变换。所以,我们可以假定用齐次坐标书写的具有下面这个形式:
P
i
m
g
=
[
x
′
y
′
1
]
=
[
m
1
m
2
m
3
]
[
x
y
z
1
]
P_{img} = \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} m_1 \\ m_2 \\ m_3 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}
Pimg=
x′y′1
=
m1m2m3
xyz1
所以
m
3
P
w
o
r
l
d
≡
1
m_3 P_{world} \equiv 1
m3Pworld≡1, 得到
m
3
=
[
0
,
0
,
0
,
1
]
m_3 = [0, 0, 0, 1]
m3=[0,0,0,1]. 得出
x
′
=
m
1
P
w
o
r
l
d
,
y
′
=
m
2
P
w
o
r
l
d
x' = m_1P_{world}, y' = m_2P_{world}
x′=m1Pworld,y′=m2Pworld.
这个时候 M M M只有8个自由度(只有 m 1 , m 2 m_1, m_2 m1,m2是有效的),因此相比正交投影减小了自由度的数量。
1.1.3 透镜
小孔的大小实际上就是光圈大小。当小孔变大的时候,场景中的同一个点会在像平面上映射出多个点,就造成了模糊。如果想清晰,就要缩小光圈大小,而这又会造成进入的光线变少,图像变暗。所以,我们需要借助透镜汇聚光线。
我们可以用近轴折射模型来描述透镜的成像:
在上面的图中, f f f不是相机焦距了,而是透镜焦距。根据折射定律: f = R 2 ( n − 1 ) f=\frac{R}{2(n-1)} f=2(n−1)R, R R R是球面半径, n n n是折射率。所以透镜到像平面的距离为 z ′ = f + z 0 z' = f + z_0 z′=f+z0, 在计算坐标映射时,需要用 z ′ z' z′代替 f f f,例如 y ′ = z ′ y z y' = z' \frac{y}{z} y′=z′zy.
但是透镜也会造成径向畸变,这是因为在透镜边缘的光线投射到的点和针孔模型理论的点有偏离造成的,分为枕形畸变和桶形畸变: