参考论文:
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr98-71.pdf
针孔相机模型
世界坐标系
相机坐标系
归一化平面坐标系
像平面坐标系
像素坐标系
关于相机模型的文章太多了,要搞清楚,首先要弄清楚这5个坐标系,以及他们之间的转换关系。我这里开始由世界坐标系一步一步推导到像素坐标系进行讲解。
-
世界坐标系到相机坐标系
实际上是两个三维坐标系之间的转换关系,属于刚体变换,也就是说只有旋转R和平移t变换。旋转矩阵R是正交矩阵的单位矩阵,并且R的转置等于R的逆。 X c X_c Xc相机坐标系的点, X w X_w Xw世界坐标系的点。
.
X c = [ x c y c z c ] , X w = [ x w y w z w ] X_c = \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right], X_w=\left[ \begin{matrix} x_w \\ y_w \\ z_w \end{matrix} \right] Xc=⎣⎡xcyczc⎦⎤,Xw=⎣⎡xwywzw⎦⎤
X
c
=
R
X
w
+
t
R
T
=
R
−
1
X_c = RX_w + t \\ R^T=R^{-1}
Xc=RXw+tRT=R−1
R表示旋转矩阵,t表示平移向量,如果把
X
c
,
X
w
X_c, X_w
Xc,Xw写成齐次向量的形式,那么他们之间的变换关系就可以写成矩阵相乘的形式。
[ x c y c z c 1 ] = [ R t 0 T 1 ] [ x w y w z w 1 ] \left[ \begin{matrix} x_c \\ y_c \\ z_c \\ 1 \end{matrix} \right]=\left[ \begin{matrix} R & t \\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] ⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤=[R0Tt1]⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
相机坐标系和世界坐标系之间可以互相转换,其中最常用的就是如何确定相机中心在世界坐标系中的位置
X
w
=
R
−
1
(
X
c
−
t
)
=
R
−
1
X
c
−
R
−
1
t
=
R
T
X
c
−
R
T
t
X_w = R^{-1} (X_c - t) \\ = R^{-1}X_c - R^{-1}t \\=R^TX_c-R^Tt
Xw=R−1(Xc−t)=R−1Xc−R−1t=RTXc−RTt
由于相机在相机坐标系的坐标为原点
X
c
=
[
0
0
0
]
Xc =\left[\begin{matrix} 0 & 0 & 0 \end{matrix} \right]
Xc=[000]
所以相机在世界坐标系中的坐标为:
X
w
c
=
−
R
T
t
X_w^c = -R^Tt
Xwc=−RTt
相机坐标系到像平面坐标系
根据三角形相似
x
=
f
x
c
z
c
y
=
f
y
c
z
c
x = f \frac{x_c}{z_c} \\ y = f \frac{y_c}{z_c}
x=fzcxcy=fzcyc
写成矩阵的形式
[
x
y
1
]
=
[
f
0
0
0
f
0
0
0
1
]
[
x
c
/
z
c
y
c
/
z
c
1
]
1
z
c
[
f
0
0
0
f
0
0
0
1
]
[
x
c
y
c
z
c
]
\left[ \begin{matrix} x \\ y \\ 1 \end{matrix} \right] =\left[ \begin{matrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c/z_c \\ y_c/z_c \\ 1 \end{matrix} \right] \\ \frac{1}{z_c} \left[ \begin{matrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right]
⎣⎡xy1⎦⎤=⎣⎡f000f0001⎦⎤⎣⎡xc/zcyc/zc1⎦⎤zc1⎣⎡f000f0001⎦⎤⎣⎡xcyczc⎦⎤
这里
f
f
f表示焦距,单位是m,
[
x
c
/
z
c
y
c
/
z
c
1
]
T
\left[ \begin{matrix} x_c/z_c & y_c/z_c & 1 \end{matrix} \right]^T
[xc/zcyc/zc1]T为归一化平面坐标
像平面坐标系到图像坐标系
由于图像坐标系是用像素表示的,像平面坐标系都是m为单位的,所以要进行转换,
焦距f转换为像素,
d
x
,
d
y
d_x,d_y
dx,dy 分别表示x和y方向每个像素占多大。
f
x
,
f
y
fx, fy
fx,fy 的单位是像素
f
x
=
f
d
x
f
y
=
f
d
y
f_x = \frac{f}{d_x} \\ f_y = \frac{f}{d_y}
fx=dxffy=dyf
由于像平面的原点在中心,而像素坐标的原点在左上角,因而需要在x和y方向分别平移 c x , c y c_x, c_y cx,cy个像素
[ u v 1 ] = [ 1 d x 0 c x 0 1 d y c y 0 0 1 ] [ x y 1 ] \left[ \begin{matrix} u \\ v \\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{d_x}& 0 & c_x \\ 0 & \frac{1}{d_y} & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y\\ 1 \end{matrix} \right] ⎣⎡uv1⎦⎤=⎣⎡dx1000dy10cxcy1⎦⎤⎣⎡xy1⎦⎤
相机坐标系->像平面坐标->像素坐标
[
u
v
1
]
=
[
1
d
x
0
c
x
0
1
d
y
c
y
0
0
1
]
[
x
y
1
]
=
1
z
c
[
1
d
x
0
c
x
0
1
d
y
c
y
0
0
1
]
[
f
0
0
0
f
0
0
0
1
]
[
x
c
y
c
z
c
]
=
1
z
c
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
x
c
y
c
z
c
]
\left[ \begin{matrix} u \\ v \\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{d_x}& 0 & c_x \\ 0 & \frac{1}{d_y} & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x \\ y\\ 1 \end{matrix} \right]\\=\frac{1}{z_c} \left[ \begin{matrix} \frac{1}{d_x}& 0 & c_x \\ 0 & \frac{1}{d_y} & c_y \\ 0 & 0 & 1 \end{matrix} \right]\left[ \begin{matrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right]\\=\frac{1}{z_c} \left[ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x_c \\ y_c \\ z_c \end{matrix} \right]
⎣⎡uv1⎦⎤=⎣⎡dx1000dy10cxcy1⎦⎤⎣⎡xy1⎦⎤=zc1⎣⎡dx1000dy10cxcy1⎦⎤⎣⎡f000f0001⎦⎤⎣⎡xcyczc⎦⎤=zc1⎣⎡fx000fy0cxcy1⎦⎤⎣⎡xcyczc⎦⎤
其中矩阵为相机内参矩阵,只和相机本身有关
f
x
,
f
y
f_x, f_y
fx,fy为相机焦距,一般情况向两者相等,
c
x
,
c
y
c_x, c_y
cx,cy为中心偏移像素,一般情况下为图像的1/2。
K
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
K= \left[ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right]
K=⎣⎡fx000fy0cxcy1⎦⎤
那么世界坐标系到像素坐标系就可以写成:
[
u
v
1
]
=
1
z
c
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
R
t
0
T
1
]
[
x
w
y
w
z
w
1
]
=
1
z
c
K
[
R
∣
t
]
[
x
w
y
w
z
w
1
]
\left[ \begin{matrix} u \\ v \\ 1 \end{matrix} \right] =\frac{1}{z_c} \left[ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} R & t \\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] \\=\frac{1}{z_c}K[R|t] \left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right]
⎣⎡uv1⎦⎤=zc1⎣⎡fx000fy0cxcy1⎦⎤[R0Tt1]⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤=zc1K[R∣t]⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
其中
[
R
∣
t
]
为
外
参
矩
阵
,
表
示
世
界
坐
标
系
到
相
机
坐
标
系
的
转
换
矩
阵
,
K
为
相
机
内
参
矩
阵
[R|t] 为外参矩阵,表示世界坐标系到相机坐标系的转换矩阵, K 为相机内参矩阵
[R∣t]为外参矩阵,表示世界坐标系到相机坐标系的转换矩阵,K为相机内参矩阵
P
=
K
[
R
∣
t
]
P = K[R|t]
P=K[R∣t]
P为投影矩阵,表示一个4x4的矩阵。
关于针孔相机模型就解释到这里。
相机畸变模型
相机畸变模型一般包括径向畸变和切向畸变
- 径向畸变是由于透镜的形状导致的,有桶形畸变和枕形畸变。对应的数学模型:
x d i s t = x + x ( k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t = y + y ( k 1 r 2 + k 2 r 4 + k 3 r 6 ) r = x 2 + y 2 x_{dist} = x+x(k_1r^2 + k_2r^4+k_3r^6) \\ y_{dist} = y+y(k_1r^2 + k_2r^4+k_3r^6) \\ r=x^2+y^2 xdist=x+x(k1r2+k2r4+k3r6)ydist=y+y(k1r2+k2r4+k3r6)r=x2+y2
- 切向畸变是由于安装导致透镜和成像平面不严格平行。对应的数学模型:
x d i s t = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t = y + 2 p 2 x y + p 1 ( r 2 + 2 y 2 ) x_{dist} = x + 2p_1xy+p_2(r^2+2x^2)\\y_{dist} = y + 2p_2xy+p_1(r^2+2y^2) xdist=x+2p1xy+p2(r2+2x2)ydist=y+2p2xy+p1(r2+2y2)
同时进行径向畸变和切向畸变矫正,联合在一起:
x
d
i
s
t
=
x
+
x
(
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
=
y
+
y
(
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
+
2
p
2
x
y
+
p
1
(
r
2
+
2
y
2
)
x_{dist} = x+x(k_1r^2 + k_2r^4+k_3r^6) + 2p_1xy+p_2(r^2+2x^2)\\ y_{dist} = y+y(k_1r^2 + k_2r^4+k_3r^6) +2p_2xy+p_1(r^2+2y^2)
xdist=x+x(k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydist=y+y(k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2)
x,y 的值对应的是归一化平面坐标系的值,因而在校正图像的时候需要先把像素坐标转换为归一化平面坐标,然后再校正,最后再把校正后的
x
d
i
s
t
,
y
d
i
s
t
x_{dist}, y_{dist}
xdist,ydist计算到像素坐标。
u
=
f
x
x
d
i
s
t
+
c
x
v
=
f
y
y
d
i
s
t
+
c
y
u = f_xx_{dist} + c_x \\ v = f_yy_{dist} + c_y
u=fxxdist+cxv=fyydist+cy
畸变系数涉及 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