智能车坐标变换推导

一个坐标系可以通过一个原点 O O O和三个基来 e 1 , e 2 , e 3 \boldsymbol{e_1},\boldsymbol{e_2},\boldsymbol{e_3} e1,e2,e3确定。

那么对于世界坐标系,其原点 O w O_w Ow为:
O w = ( 0 0 0 ) O_w = \left( \begin{array}{c} 0 \\ 0 \\ 0 \\ \end{array} \right) Ow= 000
其基为:
e 1 = ( 1 0 0 )   e 2 = ( 0 1 0 )   e 3 = ( 0 0 1 ) \boldsymbol{e_1} = \left( \begin{array}{c} 1 \\ 0 \\ 0 \\ \end{array} \right) \ \boldsymbol {e_2} = \left( \begin{array}{c} 0 \\ 1 \\ 0 \\ \end{array} \right) \ \boldsymbol {e_3} = \left( \begin{array}{c} 0 \\ 0 \\ 1 \\ \end{array} \right) e1= 100  e2= 010  e3= 001
现在设另一个坐标系 O c O_c Oc ,其原点坐标 O c O_c Oc在世界坐标系内的坐标为 B = ( t 1 , t 2 , t 3 ) T B = (t_1,t_2,t_3)^{T} B=(t1,t2,t3)T,所以有:
O c = O w + ( e 1   e 2   e 3 ) ( t 1 t 2 t 3 ) O_c = O_w +\left( \begin{array}{c} \boldsymbol{e_{1}} \ \boldsymbol{e_{2}} \ \boldsymbol{e_{3}} \end{array} \right) \left( \begin{array}{c} t_1 \\ t_2 \\ t_3 \\ \end{array} \right) Oc=Ow+(e1 e2 e3) t1t2t3
其基 e c 1 , e c 2 , e c 3 \boldsymbol{e_{c1}},\boldsymbol{e_{c2}},\boldsymbol{e_{c3}} ec1,ec2,ec3 O w O_w Ow坐标系的基 e 1 , e 2 , e 3 \boldsymbol{e_1},\boldsymbol{e_2},\boldsymbol{e_3} e1,e2,e3​的变化矩阵为:
( e c 1   e c 2   e c 3 ) = ( e 1   e 2   e 3 ) M \left( \begin{array}{c} \boldsymbol{e_{c1}} \ \boldsymbol{e_{c2}} \ \boldsymbol{e_{c3}} \end{array} \right)= \left( \begin{array}{c} \boldsymbol{e_{1}} \ \boldsymbol{e_{2}} \ \boldsymbol{e_{3}} \end{array} \right) \boldsymbol{M} (ec1 ec2 ec3)=(e1 e2 e3)M
设一点 P P P O w O_w Ow的坐标为 ( X w , Y w , Z w ) T (X_w,Y_w,Z_w)^T (Xw,Yw,Zw)T
P = O w + ( e c 1   e c 2   e c 2 ) ( X w Y w Z w ) P= O_w + \left( \begin{array}{c} \boldsymbol{e_{c1}} \ \boldsymbol{e_{c2}} \ \boldsymbol{e_{c2}} \end{array} \right) \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ \end{array} \right) P=Ow+(ec1 ec2 ec2) XwYwZw
由(3)和(4)式得:
O w = O c − ( e c 1   e c 2   e c 3 ) M − 1 ( t 1 t 2 t 3 ) O_w = O_c - \left( \begin{array}{c} \boldsymbol{e_{c1}} \ \boldsymbol{e_{c2}} \ \boldsymbol{e_{c3}} \end{array} \right) \boldsymbol{M^{-1}} \left( \begin{array}{c} t_1 \\ t_2 \\ t_3 \\ \end{array} \right) Ow=Oc(ec1 ec2 ec3)M1 t1t2t3
将(4)和(6)式代入(5)得:
P = O w + ( e c 1   e c 2   e c 3 ) M − 1 ( X w Y w Z w ) = O c + ( e c 1   e c 2   e c 3 ) M − 1 ( ( X w Y w Z w ) − ( t 1 t 2 t 3 ) ) \begin{align*} P &= O_w + \left( \begin{array}{c} \boldsymbol{e_{c1}} \ \boldsymbol{e_{c2}} \ \boldsymbol{e_{c3}} \end{array} \right) \boldsymbol{M^{-1}} \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ \end{array} \right)\\ & = O_c + \left( \begin{array}{c} \boldsymbol{e_{c1}} \ \boldsymbol{e_{c2}} \ \boldsymbol{e_{c3}} \end{array} \right) \boldsymbol{M^{-1}}(\left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ \end{array} \right)-\left( \begin{array}{c} t_1 \\ t_2 \\ t_3 \\ \end{array} \right)) \end{align*} P=Ow+(ec1 ec2 ec3)M1 XwYwZw =Oc+(ec1 ec2 ec3)M1( XwYwZw t1t2t3 )
所以 P P P O c O_c Oc​系的坐标为:
M − 1 ( ( X w Y w Z w ) − ( t 1 t 2 t 3 ) ) \boldsymbol{M^{-1}} ( \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ \end{array} \right)- \left( \begin{array}{c} t_1 \\ t_2 \\ t_3 \\ \end{array} \right) ) M1( XwYwZw t1t2t3 )

可以将其写成齐次坐标形式:
( X c Y c Z c 1 ) = ( M − 1 − M − 1 B 0 1 ) ( X w Y w Z w 1 ) \left( \begin{array}{c} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{array} \right) =\left( \begin{array}{cccc} \boldsymbol{M^{-1}} & -\boldsymbol{M^{-1}B}\\ \boldsymbol{0} & \boldsymbol{1} \end{array} \right) \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{array} \right) XcYcZc1 =(M10M1B1) XwYwZw1

现在来求矩阵 M M M。因为我们的相机一般只会绕 y y y轴旋转,所以我们设其绕 y y y轴旋转的角度为 a a a
( e c 1   e c 2   e c 3 ) = ( e 1   e 2   e 3 ) ( cos ⁡ a 0 sin ⁡ a 0 1 0 − sin ⁡ a 0 cos ⁡ a ) \left( \begin{array}{c} \boldsymbol{e_{c1}} \ \boldsymbol{e_{c2}} \ \boldsymbol{e_{c3}} \end{array} \right)= \left( \begin{array}{c} \boldsymbol{e_{1}} \ \boldsymbol{e_{2}} \ \boldsymbol{e_{3}} \end{array} \right) \left( \begin{array}{cccc} \cos a & 0 & \sin a \\ 0 & 1 & 0 \\ -\sin a & 0 & \cos a \\ \end{array} \right) (ec1 ec2 ec3)=(e1 e2 e3) cosa0sina010sina0cosa
将该变换矩阵称为相机的外参矩阵:
T = ( M − 1 − M − 1 B 0 1 ) = ( cos ⁡ ( a ) 0 − sin ⁡ ( a ) t 3 sin ⁡ ( a ) − t 1 cos ⁡ ( a ) 0 1 0 − t 2 sin ⁡ ( a ) 0 cos ⁡ ( a ) t 1 ( − sin ⁡ ( a ) ) − t 3 cos ⁡ ( a ) 0 0 0 1 ) T= \left( \begin{array}{cccc} \boldsymbol{M^{-1}} & -\boldsymbol{M^{-1}B}\\ \boldsymbol{0} & \boldsymbol{1} \end{array} \right)= \left( \begin{array}{cccc} \cos (a) & 0 & -\sin (a) & t_3 \sin (a)-t_1 \cos (a) \\ 0 & 1 & 0 & -t_2 \\ \sin (a) & 0 & \cos (a) & t_1 (-\sin (a))-t_3 \cos (a) \\ 0 & 0 & 0 & 1 \\ \end{array} \right) T=(M10M1B1)= cos(a)0sin(a)00100sin(a)0cos(a)0t3sin(a)t1cos(a)t2t1(sin(a))t3cos(a)1

二、相机坐标到图片坐标

设相机的正方向为X轴方向,其焦距为 f f f P c P_c Pc点在相机成像平面的坐标为 P n   ( X n , Y n , Z n ) P_n\ (X_n,Y_n,Z_n) Pn (Xn,Yn,Zn),则有:
X c f = Z c Z n = Y c Y n \frac{X_c}{f} = \frac{Z_c}{Z_n} = \frac{Y_c}{Y_n} fXc=ZnZc=YnYc
于是有:
( 1 Y n Z n ) = 1 X c ( 1 0 0 0 f 0 0 0 f ) ( X c Y c Z c ) \left( \begin{array}{c} 1 \\ Y_n\\ Z_n\\ \end{array} \right)= \frac{1}{X_c} \left( \begin{array}{cccc} 1 & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & f \\ \end{array} \right) \left( \begin{array}{c} X_c \\ Y_c\\ Z_c\\ \end{array} \right) 1YnZn =Xc1 1000f000f XcYcZc

设相机的horizontal FOV 为 ϕ \phi ϕ,其水平分辨率为 w w w,纵向分辨率为 h h h,则相机成像平面的宽度 W W W和高度 H H H为:
W = 2 f tan ⁡ ϕ 2 H = 2 f h w tan ⁡ ϕ 2 W =2f \tan{\frac{\phi}{2}} \\ H =2\frac{fh}{w} \tan{\frac{\phi}{2}} W=2ftan2ϕH=2wfhtan2ϕ
因此,相机成像平面的 Y Y Y轴坐标 Y n Y_n Yn范围为 [ − W 2 , W 2 ] [-\frac{W}{2},\frac{W}{2}] [2W,2W] Z Z Z轴坐标范围 Z n Z_n Zn [ − H 2 , H 2 ] [-\frac{H}{2},\frac{H}{2}] [2H,2H]

设点 P n P_n Pn在像素坐标系中的坐标为 ( u , v ) (u,v) (u,v),则有:
u = w ( − Y n + W / 2 ) W v = h ( − Z n + H / 2 ) H u = \frac{w(-Y_n +W/2)}{W} \\ v = \frac{h(-Z_n +H/2)}{H} \\ u=Ww(Yn+W/2)v=Hh(Zn+H/2)
将其写成矩阵形式:
( 1 u v ) = ( 1 0 0 w 2 − w W 0 h 2 0 − h H ) ( 1 Y n Z n ) \left( \begin{array}{c} 1 \\ u \\ v \\ \end{array} \right)= \left( \begin{array}{cccc} 1 & 0 & 0 \\ \frac{w}{2} & -\frac{w}{W} & 0 \\ \frac{h}{2} & 0 & -\frac{h}{H} \\ \end{array} \right) \left( \begin{array}{c} 1 \\ Y_n \\ Z_n \\ \end{array} \right) 1uv = 12w2h0Ww000Hh 1YnZn
所以,相机的内参矩阵 K K K​为:
K = ( 1 0 0 w 2 − f w W 0 h 2 0 − f h H ) K= \left( \begin{array}{ccc} 1 & 0 & 0 \\ \frac{w}{2} & -\frac{f w}{W} & 0 \\ \frac{h}{2} & 0 & -\frac{f h}{H} \\ \end{array} \right) K= 12w2h0Wfw000Hfh
因此,整个变换过程为:
( 1 u v ) = 1 X c K T ′ ( X w Y w Z w 1 ) \left( \begin{array}{c} 1 \\ u \\ v \\ \end{array} \right)= \frac{1}{X_c}KT' \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{array} \right) 1uv =Xc1KT XwYwZw1
注意到这里有一个齐次坐标到非齐次坐标的变换,所以矩阵 T ′ T' T为:
T ′ = ( M − 1 − M − 1 B ) T'= \left( \begin{array}{cccc} \boldsymbol{M^{-1}} & -\boldsymbol{M^{-1}B}\\ \end{array} \right) T=(M1M1B)
它是一个三行四列的矩阵。

H = K T ′ H=KT' H=KT,于是整个变换可以写为:
( 1 u v ) = 1 X c H ( X w Y w Z w 1 ) \left( \begin{array}{c} 1 \\ u \\ v \\ \end{array} \right)= \frac{1}{X_c}H \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{array} \right) 1uv =Xc1H XwYwZw1
可以知道H是一个三行四列矩阵,所以 H H H​不可逆。因此,我们不能根据像素坐标反向求出世界坐标。这说明了深度信息在成像过程中丢失了。

现在还剩下一个问题,我们似乎还不知道 X c X_c Xc,作如下变换:
( X c X c u X c v ) = H ( X w Y w Z w 1 ) \left( \begin{array}{c} X_c \\ X_cu \\ X_cv \\ \end{array} \right)= H \left( \begin{array}{c} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{array} \right) XcXcuXcv =H XwYwZw1

三、特殊情况的像素坐标到世界坐标变换

在特殊情况下, 可以求得 H H H的逆。比如对于汽车上的摄像头,我们要获取地面上的车道信息,可以认为 Z w Z_w Zw恒等于0:
( 1 u v ) = 1 X c ( h 11 h 12 h 13 h 14 h 21 h 22 h 23 h 24 h 31 h 32 h 33 h 34 ) ( X w Y w 0 1 ) \left( \begin{array}{c} 1 \\ u \\ v \\ \end{array} \right)= \frac{1}{X_c} \left( \begin{array}{cccc} h_{11} & h_{12} & h_{13} & h_{14} \\ h_{21} & h_{22} & h_{23} & h_{24} \\ h_{31} & h_{32} & h_{33} & h_{34} \\ \end{array} \right) \left( \begin{array}{c} X_w \\ Y_w \\ 0 \\ 1 \\ \end{array} \right) 1uv =Xc1 h11h21h31h12h22h32h13h23h33h14h24h34 XwYw01
可以发现 H H H的第三列其实是没有意义的,于是可以将 H H H矩阵变为一个 3 × 3 3\times3 3×3的方阵,而 ∣ H ∣ ≠ 0 |H|\neq0 H=0,可以求逆:
H = ( h 11 h 12 h 14 h 21 h 22 h 24 h 31 h 32 h 34 ) H= \left( \begin{array}{cccc} h_{11} & h_{12} & h_{14} \\ h_{21} & h_{22} & h_{24} \\ h_{31} & h_{32} & h_{34} \\ \end{array} \right) H= h11h21h31h12h22h32h14h24h34
所以该逆变换为:
( X w X c Y w X c 1 X c ) = H − 1 ( 1 u v ) \left( \begin{array}{c} \frac{X_w}{X_c} \\ \frac{Y_w}{X_c} \\ \frac{1}{X_c} \\ \end{array} \right)= H^{-1} \left( \begin{array}{c} 1 \\ u \\ v \\ \end{array} \right) XcXwXcYwXc1 =H1 1uv

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值