0. 前言

逆透视变换(IPM),将相机视角转换成鸟瞰图。其实质是求相机平面与地面的homography矩阵。之前专门有一篇博客来讲《逆透视变换(IPM)多种方式及代码总结》。但是当中还是比较杂乱且没有详细的代码推导的。这篇文章将从三种方式来介绍逆透视变换的三种方法得到homography。这里得到的Homography是可以通过下面的$K_f$转化到现实的坐标系中的。下面的式子为转换矩阵:设 (u′,v′)表示图像像素坐标系下的点,(X_w,Y_w,0) 表示世界坐标系下地面上的点坐标,(u,v)表示俯视图像素坐标点,IPM 假设地面是平坦的。P 为相机内参及外参,Res 为俯视图像素对物理空间尺寸的分辨率,单位为(meter/pixel)

在这里插入图片描述

在这里插入图片描述

1. IPM 方法一

假设鸟瞰图为像素图,先将像素坐标系转换到物理坐标系下(当前为世界坐标系),变换记为 M (4_3)
再转换到相机坐标系,变换为P=[R,t](3_4)
再转换到相机像素坐标系,变换为 K(3*3)

这样转换公式为

上式中K_f 指的鸟瞰图的假想内参,注意上式中用了一个小技巧

写成矩阵形式

那么K_f怎么定义呢?f_x的定义指的是1m有多少个像素,我们最终生成的鸟瞰图的分辨率,假设1m应该有r个点,那么 f_x=r,而鸟瞰图的范围为[w,h](单位为m),这样输出的鸟瞰图的分辨率为[W= wr,H=hr] ,这样就有了

由于直接用K来生成图像,图像上下是倒的,需要上下flip下,这里推导下上下flip对应的相机内参的变化,下面的(x,y,z) 是为了方便,假设的相机坐标系下的点

转换为相机内参为

2. IPM 方法二

使用这个方法,n^t=(0,0,1),最难理解的是d是多少,因为世界坐标系一般在地面,所以地平面为z=0,导致d=0无法求解了。结合方法一,我们来看看

从公式对比上看,d=-1,即z=1平面上进行成像,并不是我们想象中的z=0。

这样n^t=(0,0,1),在z=1上成像,即d=-1,就可以得到同样的H表达式了。

如果所有的坐标都在base_link上,则R,t都是不用的,则会变成(1-0),则只会剩下K*K_f的形式

注意最后需要将homography除以homography[3][3]的值,进行归一化,再使用cv2. warpPerspective ()就可以了,即:

cv2.warpPerspective(img, , (H,W), flags=cv2.INTER_LINEAR)

3. IPM方法三

  这种方式很直接,假设世界坐标系下感兴趣区域是 x\in [X_{min},X_{max}],y\in [Y_{min},Y_{max}], z\in [Z_{min},Z_{max}],设定 (Res),即可生成俯视图要生成的像素图。

  基于下面公式,可以求出世界坐标系下两条平行 (z)轴的平行直线在图像坐标系下的交点,即消失点(Vanishing Point)。假设世界坐标系下平行 (z)轴的直线表示为,点 ((x_a,x_b,x_c)) 及方向向量 (k(0,0,1)),那么可得该直线上任意一点投影到图像坐标系下表示,当 (k) 趋向于无穷大时,即可得到消失点坐标:
  在这里插入图片描述
   有了图像坐标系下的消失点坐标以后,我们就可以选定需要作透视变换的 ROI 梯形区域(逆透视变换到俯视图后,梯形变矩形)。选定梯形四个角点后,根据像素距离关系,定义俯视图下其对应的矩形框四个像素坐标点,这样能得到四组(2)方程组,足可求解自由度 8 的透视矩阵 $(P)$。OpenCV 有较成熟的函数,更详细的代码原理可见链接,在Opencv中就是使用的该方法来求解homography的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考链接

https://leijiezhang001.github.io/lane-det-from-BEV/

https://zhuanlan.zhihu.com/p/507701366