相机投影
1. 统一坐标系定义
图1 相机投影坐标系
(
x
w
−
y
w
−
z
w
)
(x_w-y_w-z_w)
(xw−yw−zw)表示世界坐标系WCS: World Coordinate System
(
x
o
−
y
o
−
z
o
)
(x_o-y_o-z_o)
(xo−yo−zo)表示对象固有坐标系OCS: Object Intrinsic Coordinate System
(
x
c
−
y
c
−
z
c
)
(x_c-y_c-z_c)
(xc−yc−zc)表示相机坐标系CCS: Camera Coordinate System
(
x
i
−
y
i
−
z
i
)
(x_i-y_i-z_i)
(xi−yi−zi)表示图像坐标系ICS: Image Coordinate System
(
u-v
)
(\text {u-v})
(u-v)表示像素坐标系PCS: Pixel Coordinate System
定义一个相机对象固有坐标系,便于计算相机与世界坐标系之间的变换,即相机外参。
2. 统一点的形式
p w = [ x w y w z w 1 ] , p c = [ x c y c z c 1 ] , p i = [ x i y i 1 ] , p p = [ u v 1 ] ( 22 ) p_w = \begin{bmatrix}x_w \\ y_w \\ z_w \\1\end{bmatrix} , p_c = \begin{bmatrix}x_c \\ y_c \\ z_c \\1\end{bmatrix}, p_i = \begin{bmatrix}x_i \\ y_i \\ 1\end{bmatrix}, p_p = \begin{bmatrix}\text{u} \\ \text{v} \\ 1\end{bmatrix} \qquad(22) pw=⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤,pc=⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤,pi=⎣⎡xiyi1⎦⎤,pp=⎣⎡uv1⎦⎤(22)
p w , p c , p i , p p p_w, p_c, p_i, p_p pw,pc,pi,pp,分别表示点在世界坐标系WCS,相机坐标系CCS,图像中心坐标系ICS,和像素坐标系PCS下表达。
3. 统一参数和矩阵
T p i = k c a m = [ f x 0 c x 0 f y c y 0 0 1 ] ( 23 ) T i p = k c a m − 1 = [ 1 f x 0 − c x f x 0 1 f y − c y f y 0 0 1 ] ( 24 ) \begin{aligned} T_{pi} &= k_{cam} = \begin{bmatrix}f_x &0 &c_x \\ 0 &f_y &c_y \\ 0 &0 &1 \end{bmatrix} \qquad&(23) \\ T_{ip} &= k_{cam}^{-1}= \begin{bmatrix}\frac{1}{f_x} &0 &-\frac{c_x}{f_x} \\ 0 &\frac{1}{f_y} &-\frac{c_y}{f_y} \\ 0 &0 &1 \end{bmatrix} \qquad&(24) \end{aligned} TpiTip=kcam=⎣⎡fx000fy0cxcy1⎦⎤=kcam−1=⎣⎡fx1000fy10−fxcx−fycy1⎦⎤(23)(24)
k
c
a
m
k_{cam}
kcam为相机内参矩阵,即ICS坐标点到PCS坐标点的变换
T
p
i
T_{pi}
Tpi;
k
c
a
m
−
1
k_{cam}^{-1}
kcam−1为相机内参矩阵的逆矩阵,即像PCS坐标点到ICS坐标点的变换
T
i
p
T_{ip}
Tip;
f
x
,
f
y
f_x,f_y
fx,fy分别为相机横向焦距,竖向焦距,单位为像素;
c
x
,
c
y
c_x,c_y
cx,cy表示图像中心点在PCS下的坐标,单位为像素。
T w o i = [ cos ( 90 ) − sin ( 90 ) 0 0 sin ( 90 ) cos ( 90 ) 0 0 0 0 1 h 0 0 0 1 ] = [ 0 − 1 0 0 1 0 0 0 0 0 1 h 0 0 0 1 ] ( 25 ) T_{wo_i} = \begin{bmatrix}\cos(90) &-\sin(90) &0 &0 \\ \sin(90) &\cos(90) &0 &0 \\ 0 &0 &1 &h\\0 &0 &0 &1 \end{bmatrix} = \begin{bmatrix}0 &-1 &0 &0 \\ 1 &0 &0 &0 \\ 0 &0 &1 &h\\0 &0 &0 &1 \end{bmatrix} \qquad(25) Twoi=⎣⎢⎢⎡cos(90)sin(90)00−sin(90)cos(90)00001000h1⎦⎥⎥⎤=⎣⎢⎢⎡0100−1000001000h1⎦⎥⎥⎤(25)
T w o i T_{wo_i} Twoi表示初始OCS在WCS下的表达,是相机初始外参,从图1中可以看出,初始OCS可由WCS先绕自身Z轴旋转了90度,并沿自身Z轴正向平移h得到,最终得到上述变换矩阵 T w o i T_{wo_i} Twoi。
T o i o x = [ 1 0 0 0 0 cos ( α ) − sin ( α ) 0 0 sin ( α ) cos ( α ) 0 0 0 0 1 ] ( 26 ) T o i o y = [ cos ( β ) 0 sin ( β ) 0 0 1 0 0 − sin ( β ) 0 cos ( β ) 0 0 0 0 1 ] ( 27 ) T o i o z = [ cos ( γ ) − sin ( γ ) 0 0 sin ( γ ) cos ( γ ) 0 0 0 0 1 0 0 0 0 1 ] ( 28 ) \begin{aligned} T_{o_io_x} &= \begin{bmatrix}1 &0 &0 &0 \\ 0 &\cos(\alpha) &-\sin(\alpha) &0 \\ 0 &\sin(\alpha) &\cos(\alpha) &0\\0 &0 &0 &1 \end{bmatrix} \qquad&(26) \\ T_{o_io_y} &= \begin{bmatrix}\cos(\beta) &0 &\sin(\beta) &0 \\ 0 &1 &0 &0 \\ -\sin(\beta) &0 &\cos(\beta) &0\\0 &0 &0 &1 \end{bmatrix} \qquad&(27) \\ T_{o_io_z} &= \begin{bmatrix}\cos(\gamma) &-\sin(\gamma) &0 &0 \\ \sin(\gamma) &\cos(\gamma) &0 &0 \\ 0 &0 &1 &0\\0 &0 &0 &1 \end{bmatrix} \qquad&(28) \end{aligned} ToioxToioyToioz=⎣⎢⎢⎡10000cos(α)sin(α)00−sin(α)cos(α)00001⎦⎥⎥⎤=⎣⎢⎢⎡cos(β)0−sin(β)00100sin(β)0cos(β)00001⎦⎥⎥⎤=⎣⎢⎢⎡cos(γ)sin(γ)00−sin(γ)cos(γ)0000100001⎦⎥⎥⎤(26)(27)(28)
T o i o c = T o i o z ∗ T o i o y ∗ T o i o x T o i o c = [ cos ( γ ) cos ( β ) cos ( γ ) sin ( β ) sin ( α ) − sin ( γ ) cos ( α ) cos ( γ ) sin ( β ) cos ( α ) + sin ( γ ) sin ( α ) 0 sin ( γ ) cos ( β ) sin ( γ ) sin ( β ) sin ( α ) + cos ( γ ) cos ( α ) sin ( γ ) sin ( β ) cos ( α ) − cos ( γ ) sin ( α ) 0 − sin ( β ) cos ( β ) sin ( α ) cos ( β ) cos ( α ) 0 0 0 0 1 ] ( 29 ) \begin{aligned} T_{o_io_c} &= T_{o_io_z} * T_{o_io_y} * T_{o_io_x} \\ T_{o_io_c} &= \begin{bmatrix} \cos \left(\gamma \right) \cos \left(\beta \right) &\cos \left(\gamma \right)\sin \left(\beta \right)\sin \left(\alpha \right)-\sin \left(\gamma \right)\cos \left(\alpha \right) &\cos \left(\gamma \right)\sin \left(\beta \right)\cos \left(\alpha \right)+\sin \left(\gamma \right)\sin \left(\alpha \right) &0\\ \sin \left(\gamma \right)\cos \left(\beta \right) &\sin \left(\gamma \right)\sin \left(\beta \right)\sin \left(\alpha \right)+\cos \left(\gamma \right)\cos \left(\alpha \right) &\sin \left(\gamma \right)\sin \left(\beta \right)\cos \left(\alpha \right)-\cos \left(\gamma \right)\sin \left(\alpha \right) &0\\ -\sin \left(\beta \right) &\cos \left(\beta \right)\sin \left(\alpha \right) &\cos \left(\beta \right)\cos \left(\alpha \right) &0\\ 0&0&0&1 \end{bmatrix} \qquad&(29) \end{aligned} ToiocToioc=Toioz∗Toioy∗Toiox=⎣⎢⎢⎡cos(γ)cos(β)sin(γ)cos(β)−sin(β)0cos(γ)sin(β)sin(α)−sin(γ)cos(α)sin(γ)sin(β)sin(α)+cos(γ)cos(α)cos(β)sin(α)0cos(γ)sin(β)cos(α)+sin(γ)sin(α)sin(γ)sin(β)cos(α)−cos(γ)sin(α)cos(β)cos(α)00001⎦⎥⎥⎤(29)
T o i o x , T o i o y , T o i o z T_{o_io_x},T_{o_io_y},T_{o_io_z} Toiox,Toioy,Toioz表示OCS绕其自身三个坐标轴的旋转矩阵,由于是绕固定坐标系旋转,即为外在旋转,依次左乘,则当前OCS在初始OCS下可表示为: T o i o c T_{o_io_c} Toioc。
重要说明:
WCS定义为:右-前-上;
OCS定义为:前-左-上(固连在相机对象上);
CCS定义为:右-下-前。
且通常所说的横滚角roll、俯仰角pitch,航向角yaw均是基于OCS表示的;
右滚为正,左滚为负;下俯为正,上仰为负;左偏为正,右偏为负。
T o c c = [ 1 0 0 0 0 cos ( − 90 ) − sin ( − 90 ) 0 0 sin ( − 90 ) cos ( − 90 ) 0 0 0 0 1 ] [ cos ( 90 ) 0 sin ( 90 ) 0 0 1 0 0 − sin ( 90 ) 0 cos ( 90 ) 0 0 0 0 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = [ 1 0 0 0 0 0 1 0 0 − 1 0 0 0 0 0 1 ] [ 0 0 1 0 0 1 0 0 − 1 0 0 0 0 0 0 1 ] [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = [ 0 0 1 0 − 1 0 0 0 0 − 1 0 0 0 0 0 1 ] ( 30 ) \begin{aligned} T_{o_cc} &= \begin{bmatrix}1 &0 &0 &0 \\ 0 &\cos(-90) &-\sin(-90) &0 \\ 0 &\sin(-90) &\cos(-90) &0\\ 0 &0 &0 &1 \end{bmatrix} \begin{bmatrix}\cos(90) &0 &\sin(90) &0 \\ 0 &1 &0 &0 \\ -\sin(90) &0 &\cos(90) &0\\ 0 &0 &0 &1 \end{bmatrix} \begin{bmatrix}1 &0 &0 &0 \\ 0 &1 &0 &0 \\ 0 &0 &1 &0\\ 0 &0 &0 &1 \end{bmatrix} \\ &= \begin{bmatrix}1 &0 &0 &0 \\ 0 &0 &1 &0 \\ 0 &-1 &0 &0\\ 0 &0 &0 &1 \end{bmatrix} \begin{bmatrix} 0 &0 &1 &0 \\ 0 &1 &0 &0 \\ -1 &0 &0 &0\\ 0 &0 &0 &1 \end{bmatrix} \begin{bmatrix}1 &0 &0 &0 \\ 0 &1 &0 &0 \\ 0 &0 &1 &0\\ 0 &0 &0 &1 \end{bmatrix} \\ &= \begin{bmatrix}0 &0 &1 &0 \\ -1 &0 &0 &0 \\ 0 &-1 &0 &0\\ 0 &0 &0 &1 \end{bmatrix} \qquad&(30) \end{aligned} Tocc=⎣⎢⎢⎡10000cos(−90)sin(−90)00−sin(−90)cos(−90)00001⎦⎥⎥⎤⎣⎢⎢⎡cos(90)0−sin(90)00100sin(90)0cos(90)00001⎦⎥⎥⎤⎣⎢⎢⎡1000010000100001⎦⎥⎥⎤=⎣⎢⎢⎡100000−1001000001⎦⎥⎥⎤⎣⎢⎢⎡00−10010010000001⎦⎥⎥⎤⎣⎢⎢⎡1000010000100001⎦⎥⎥⎤=⎣⎢⎢⎡0−10000−1010000001⎦⎥⎥⎤(30)
T o c c T_{o_cc} Tocc为CCS在当前OCS下的表示,这是不变的相机固有外参,该变换矩阵可由式(15)求得。具体过程为:当前OCS先绕自身X轴旋转-90度,然后绕旋转后得到坐标系的Y轴旋转90度,即可得到CCS,这个过程为绕动坐标系旋转,属于内在旋转,依次右乘,最终得到 T o c c T_{o_cc} Tocc,如式(17)。
T
w
c
=
T
w
o
i
∗
T
o
i
o
c
∗
T
o
c
c
(
31
)
T
c
w
=
T
w
c
−
1
=
[
R
3
X
3
t
3
X
1
0
1
]
=
[
r
11
r
12
r
13
t
14
r
21
r
22
r
23
t
24
r
31
r
32
r
33
t
34
0
0
0
1
]
(
32
)
\begin{aligned} T_{wc} &= T_{wo_i} * T_{o_io_c} * T_{o_cc} \qquad&(31)\\ T_{cw} &= T_{wc}^{-1}= \begin{bmatrix}R_{3X3} &t_{3X1} \\ 0 &1 \end{bmatrix} = \begin{bmatrix}r_{11} &r_{12} &r_{13} &t_{14} \\ r_{21} &r_{22} &r_{23} &t_{24} \\ r_{31} &r_{32} &r_{33} &t_{34}\\ 0 &0 &0 &1 \end{bmatrix} \qquad&(32) \end{aligned}
TwcTcw=Twoi∗Toioc∗Tocc=Twc−1=[R3X30t3X11]=⎣⎢⎢⎡r11r21r310r12r22r320r13r23r330t14t24t341⎦⎥⎥⎤(31)(32)
T
w
c
T_{wc}
Twc为CCS在WCS下的表达,可将CCS下的点变换为WCS下的点;
T
c
w
T_{cw}
Tcw为WCS在CCS下的表达,即为通常所说的相机外参,可将WCS下的点变换为CCS下的点。
注释:在具体计算相机外参
T
w
c
T_{wc}
Twc时实际上有很多种形式,这其中最让人看不懂的往往是坐标系的定义、绕那个坐标轴旋转、以及roll,yaw,pitch角度的定义,不论是网上的博客还是学术论文,每个人理解和定义的方式都不同,同时在把公式代码化的时候又常常简化过程以提高计算速度,最终造成的结果就是代码阅读性极差,在对照自己推导的公式时,发现总有地方不同,因此这里给处于混沌状态的同学一些提示:在进行任何推导前一定要先定义和梳理好坐标系以及角度的表示。
T i c = [ 1 z c 0 0 0 0 1 z c 0 0 0 0 1 z c 0 ] ( 33 ) T_{ic} = \begin{bmatrix}\frac{1}{z_c} &0 &0 &0 \\ 0 &\frac{1}{z_c} &0 &0 \\0 &0 &\frac{1}{z_c} &0 \end{bmatrix} \qquad(33) Tic=⎣⎡zc1000zc1000zc1000⎦⎤(33)
T i c T_{ic} Tic用于变换CCS下的点到ICS下,其中 z c z_c zc为点在CCS下的Z轴坐标。
4. 相机投影成像一般过程
- 逐步形式:
p c = T c w ∗ p w ( 34 ) p i = T i c ∗ p c ( 35 ) p p = k c a m ∗ p i ( 36 ) ⇓ [ x c y c z c 1 ] = [ r 11 r 12 r 13 t 14 r 21 r 22 r 23 t 24 r 31 r 32 r 33 t 34 0 0 0 1 ] [ x w y w z w 1 ] ( 37 ) [ x i y i 1 ] = [ 1 z c 0 0 0 0 1 z c 0 0 0 0 1 z c 0 ] [ x c y c z c 1 ] ( 38 ) [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ x i y i 1 ] ( 39 ) \begin{aligned} p_c &= T_{cw} * p_w \qquad&(34)\\ p_i &= T_{ic} * p_c \qquad&(35)\\ p_p &= k_{cam} * p_i \qquad&(36)\\ &\Downarrow \\ \begin{bmatrix}x_c \\ y_c \\ z_c \\1 \end{bmatrix} &= \begin{bmatrix}r_{11} &r_{12} &r_{13} &t_{14} \\ r_{21} &r_{22} &r_{23} &t_{24} \\ r_{31} &r_{32} &r_{33} &t_{34}\\ 0 &0 &0 &1 \end{bmatrix} \begin{bmatrix}x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} \qquad&(37) \\ \begin{bmatrix}x_i \\ y_i \\1 \end{bmatrix} &= \begin{bmatrix}\frac{1}{z_c} &0 &0 &0 \\ 0 &\frac{1}{z_c} &0 &0 \\ 0 &0 &\frac{1}{z_c} &0 \end{bmatrix} \begin{bmatrix}x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} \qquad&(38)\\ \begin{bmatrix}\text{u} \\ \text{v} \\1 \end{bmatrix} &= \begin{bmatrix}f_x &0 &c_x \\ 0 &f_y &c_y \\ 0 &0 &1 \end{bmatrix} \begin{bmatrix}x_i \\ y_i \\1 \end{bmatrix} \qquad&(39) \end{aligned} pcpipp⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤⎣⎡xiyi1⎦⎤⎣⎡uv1⎦⎤=Tcw∗pw=Tic∗pc=kcam∗pi⇓=⎣⎢⎢⎡r11r21r310r12r22r320r13r23r330t14t24t341⎦⎥⎥⎤⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤=⎣⎡zc1000zc1000zc1000⎦⎤⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡xiyi1⎦⎤(34)(35)(36)(37)(38)(39)
- 整体形式:
p p = T p i ∗ T i c ∗ T c w ∗ p w ( 40 ) ⇓ [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ 1 z c 0 0 0 0 1 z c 0 0 0 0 1 z c 0 ] [ r 11 r 12 r 13 t 14 r 21 r 22 r 23 t 24 r 31 r 32 r 33 t 34 0 0 0 1 ] [ x w y w z w 1 ] ( 41 ) \begin{aligned} p_p &= T_{pi} * T_{ic}* T_{cw} * p_w \qquad&(40)\\ &\Downarrow \\ \begin{bmatrix}\text{u} \\ \text{v} \\1 \end{bmatrix} &= \begin{bmatrix}f_x &0 &c_x \\ 0 &f_y &c_y \\ 0 &0 &1 \end{bmatrix} \begin{bmatrix}\frac{1}{z_c} &0 &0 &0 \\ 0 &\frac{1}{z_c} &0 &0 \\ 0 &0 &\frac{1}{z_c} &0 \end{bmatrix} \begin{bmatrix}r_{11} &r_{12} &r_{13} &t_{14} \\ r_{21} &r_{22} &r_{23} &t_{24} \\ r_{31} &r_{32} &r_{33} &t_{34}\\ 0 &0 &0 &1 \end{bmatrix} \begin{bmatrix}x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} \qquad&(41) \end{aligned} pp⎣⎡uv1⎦⎤=Tpi∗Tic∗Tcw∗pw⇓=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡zc1000zc1000zc1000⎦⎤⎣⎢⎢⎡r11r21r310r12r22r320r13r23r330t14t24t341⎦⎥⎥⎤⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤(40)(41)