0. 前言
逆透视变换(IPM),将相机视角转换成鸟瞰图。其实质是求相机平面与地面的homography矩阵。之前专门有一篇博客来讲《逆透视变换(IPM)多种方式及代码总结》。但是当中还是比较杂乱且没有详细的代码推导的。这篇文章将从三种方式来介绍逆透视变换的三种方法得到homography。这里得到的Homography是可以通过下面的 K f K_f Kf转化到现实的坐标系中的。下面的式子为转换矩阵:设 ( u ′ , v ′ ) (u′,v′) (u′,v′)表示图像像素坐标系下的点, ( X w , Y w , 0 ) (X_w,Y_w,0) (Xw,Yw,0) 表示世界坐标系下地面上的点坐标, ( u , v ) (u,v) (u,v)表示俯视图像素坐标点,IPM 假设地面是平坦的。 P P P 为相机内参及外参, R e s Res Res 为俯视图像素对物理空间尺寸的分辨率,单位为 ( m e t e r / p i x e l ) (meter/pixel) (meter/pixel)
[ u ′ v ′ 1 ] = K c a m 1 Z c a m T w o r l d c a m [ X Y Z 1 ] w o r l d = [ f x 0 u 0 0 f y v 0 0 0 1 ] 1 r 31 X + r 32 Y + t z [ R t 0 1 ] [ X Y 0 1 ] w o r l d = 1 r 31 X + r 32 Y + t z [ m 11 m 12 m 13 m 21 m 22 m 23 r 31 r 32 t z ] [ X Y 1 ] w o r l d = R e s Z c a m P [ u v 1 ] \begin{matrix}\begin{bmatrix}u' \\v' \\1\end{bmatrix} &= K_{cam}\frac{1}{Z_{cam}}T_{world}^{cam}\begin{bmatrix}X \\Y \\Z \\1\end{bmatrix}_{world}\\ &=\begin{bmatrix}f_x &0 &u_0 \\0 &f_y &v_0\\0 &0 &1\end{bmatrix}\frac{1}{r_{31}X+r_{32}Y+t_z}\begin{bmatrix}R &t\\0 &1\end{bmatrix}\begin{bmatrix}X \\Y \\0 \\1\end{bmatrix}_{world}\\&= \frac{1}{r_{31}X+r_{32}Y+t_z}\begin{bmatrix}m_{11} &m_{12} &m_{13}\\m_{21} &m_{22} &m_{23}\\r_{31} &r_{32} &t_{z}\\\end{bmatrix}\begin{bmatrix}X \\Y \\1 \end{bmatrix}_{world} = \frac{Res}{Z_{cam}} P \begin{bmatrix}u \\v \\1 \end{bmatrix} \end{matrix} u′v′1 =KcamZcam1Tworldcam XYZ1 world= fx000fy0u0v01 r31X+r32Y+tz1[R0t1] XY01 world=r31X+r32Y+tz1 m11m21r31m12m22r32m13m23tz XY1 world=ZcamResP uv1
1. IPM 方法一
- 假设鸟瞰图为像素图,先将像素坐标系转换到物理坐标系下(当前为世界坐标系),变换记为 M ( 4 ∗ 3 ) M (4*3) M(4∗3)
- 再转换到相机坐标系,变换为 P = [ R , t ] ( 3 ∗ 4 ) P=[R,t](3*4) P=[R,t](3∗4)
- 再转换到相机像素坐标系,变换为 K ( 3 ∗ 3 ) K(3*3) K(3∗3)
这样转换公式为
上式中 K f K_f Kf 指的鸟瞰图的假想内参,注意上式中用了一个小技巧
写成矩阵形式
那么
K
f
K_f
Kf怎么定义呢?
f
x
f_x
fx的定义指的是1m有多少个像素,我们最终生成的鸟瞰图的分辨率,假设1m应该有
r
r
r个点,那么
f
x
=
r
f_x=r
fx=r,而鸟瞰图的范围为
[
w
,
h
]
[w,h]
[w,h](单位为m),这样输出的鸟瞰图的分辨率为
[
W
=
w
r
,
H
=
h
r
]
[W= wr,H=hr]
[W=wr,H=hr] ,这样就有了
由于直接用 K K K来生成图像,图像上下是倒的,需要上下flip下,这里推导下上下flip对应的相机内参的变化,下面的 ( x , y , z ) (x,y,z) (x,y,z) 是为了方便,假设的相机坐标系下的点
转换为相机内参为