[BEV感知] --- IPM算法

1 IPM介绍

1.1 IPM的定义

IPM(Inverse Perspective Mapping,逆透视变换)本质:基于地面为理想平面的强几何假设,利用相机内参、外参,把前视 / 环视透视畸变的图像,反向投影映射到地面鸟瞰 BEV 平面,消除近大远小透视畸变,得到俯视俯视图。

属于纯几何无学习的 ViewTransform 方案,不训练、无网络参数,全靠矩阵运算。

1.2 IPM的前提

  • 路面是绝对平面,高度恒定 Zw=0Z_{w} =0Zw=0;
  • 相机内参K、外参R, t 精确标定;
  • 车辆行驶路面无坡度、无坑洼、无起伏。

只要路面不平、有坡道、斜坡,IPM 直接失效畸变。

基于上面IPM的强假设,所有对应的IPM有如下缺点:

  • 强依赖平面假设,坡道、起伏路、斜坡直接畸变失效;
  • 立体物体(车、人、杆)严重变形,会被拉伸、压扁、错位;
  • 远距离误差极大,越远畸变越严重;
  • 无法建模真实 3D 高度,只能做地面 2D 俯视,不能做 3D 感知;
  • 相机安装角度微小偏差,就会导致整张 BEV 偏移扭曲。

2 鱼眼相机介绍

因为现在工程上基本都是用的鱼眼相机,所以在正式介绍IPM算法之前有必要先介绍下鱼眼相机本身。

2.1 为什么需要鱼眼相机

鱼眼镜头设计的目的是要拍摄大的视野,鱼眼镜头的视场角可达到180-270度,在工程上视角超过140度的镜头被统称为鱼眼镜头。这是因为普通针孔相机视野太小,满足不了一些特别的需求。

为什么针孔相机达不到这么大的视场角呢?因为针孔相机模型是相似性投影,实际场景中的直线仍被投影成图像面上的直线。假如使用针孔相机模型达到180度的视场角,那么这种情况下的图像会变为无穷大。

2.2 鱼眼相机与普通针孔相机对比

对比维度 普通针孔相机 鱼眼相机
成像模型 线性小孔针孔模型 非线性广角畸变模型
视场角FOV 60°~90°,视野窄 180°左右,超大广角
图像畸变 畸变小,接近真实比例 桶形畸变严重,边缘拉伸
坐标投影 满足标准透视几何,可直接坐标转换 非线性,不能直接用针孔公式
标定难度 简单,只需常规内参畸变系数 复杂,需专用鱼眼投影模型标定
覆盖能力 单颗覆盖范围小,盲区大 单颗覆盖范围极大
适用位置 前视主驾感知、远距离检测 环视360°、自动泊车、近距离感知

2.3 鱼眼相机成像模型

2.3.1 普通针孔相机成像模型

常规小孔成像 / 针孔相机满足线性透视投影:

r=f⋅tan⁡θ r = f\cdot\tan\theta\ r=f⋅tanθ
θ\thetaθ:入射光线与光轴夹角
rrr:成像点到图像中心的径向距离

鱼眼镜头视场角可达 180°+,thetathetatheta 接近 90° 时 tanθ→∞tan\theta\to\inftytanθ→∞,物理上无法成像,所以必须改用专用鱼眼投影模型。

2.3.2 其他鱼眼投影模型

等距投影模型

等立体角投影模型

正交投影模型

体视投影模型

工程中没有用到,这里也不做介绍,后面用到再查吧

2.3.3 通用鱼眼相机模型Kannala-Brandt模型

鱼眼镜头生产过程中不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala-Brandt提出了一种鱼眼相机的一般多项式近似模型。通过前面四个模型,可以发现θdθ_{d}θd是θ\thetaθ的奇函数,将这些式子按泰勒级数展开,发现θdθ_{d}θd用θ\thetaθ的奇次多项式表示,即
θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9 \theta_d = k_0\theta + k_1\theta^3 + k_2\theta^5 + k_3\theta^7 + k_4\theta^9 θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9

上式是根据四种鱼眼相机投影模型得出的一种通用鱼眼相机多项式模型。

2.4 空间点到图像的投影过程


step1 世界坐标系转相机坐标系
XC=RX+T X_{C}=RX+T XC=RX+T
XXX世界坐标系下的 3D 点坐标 (Xw,Yw,Zw,1)(X_w,Y_w,Z_w,1)(Xw,Yw,Zw,1)(齐次形式)
RRR:相机外参的旋转矩阵,描述相机姿态
TTT:相机外参的平移向量,描述相机位置
XcX_cXc:相机坐标系下的点坐标 (Xc,Yc,Zc)(X_c,Y_c,Z_c)(Xc,Yc,Zc)

step2 camera转到归一化相机球面上
x=Xc1y=Xc2z=Xc3a=xzb=yz x = X_{c1} \\ y = X_{c2} \\ z = X_{c3} \\ a=\frac{x}{z} \\ b=\frac{y}{z} x=Xc1y=Xc2z=Xc3a=zxb=zy

这里XC1=XC,XC2=YC,XC3=ZCX_{C1}=X_{C},X_{C2}=Y_{C},X_{C3}=Z_{C}XC1=XC,XC2=YC,XC3=ZC,也就是相机坐标系的三个分量

归一化就是除以Z轴深度,消除远近的影响,除以 ZcZ_cZc 后,得到的 (a,b,1)(a,b,1)(a,b,1) 就是光线方向在 Z=1 平面上的投影,相当于把所有光线都 "平移" 到同一个平面上,方便后续计算角度。
setp3 计算θ\thetaθ角
{r=xc2+yc2θ=atan2(r,∣zc∣)=atan2(r,1)=arctan⁡(r) \begin{cases} r = \sqrt{x_c^2 + y_c^2} \\ \theta = \mathrm{atan2}(r, |z_c|) = \mathrm{atan2}(r, 1) = \arctan(r) \end{cases} {r=xc2+yc2 θ=atan2(r,∣zc∣)=atan2(r,1)=arctan(r)

算出光线和光轴的夹角 θ\thetaθ

Step4 利用KB畸变模型进行加畸变处理

模拟鱼眼镜头的实际畸变,把理想的光线夹角 θ\thetaθ 变成实际成像的畸变角度 θd\theta_dθd。
θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8) \theta_d = \theta(1 + k_1\theta^2 + k_2\theta^4 + k_3\theta^6 + k_4\theta^8) θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)

θ\thetaθ:理想情况下,光线与光轴的夹角,上面Step3计算得到
k1,k2,k3,k4k_{1}, k_{2}, k_{3}, k_{4}k1,k2,k3,k4:KB 模型的畸变系数,由相机标定得到
θd\theta_dθd:畸变修正后的实际角度,镜头误差让它偏离理想的等距投影

step5 计算该点在图像物理坐标系中的坐标

根据等距投影模型,d=fθdd=f\theta_{d}d=fθd,f=1,由相似三角形,dr=x'a\frac{d}{r}=\frac{x`}{a}rd=ax'推导出以下公式:
{x′=(θdr)ay′=(θdr)b \begin{cases} x' = \left(\frac{\theta_d}{r}\right)a \\ y' = \left(\frac{\theta_d}{r}\right)b \end{cases} {x′=(rθd)ay′=(rθd)b
step6 最终图像像素坐标系uv

把物理坐标转换成图像像素坐标,得到最终的 (u,v)(u,v)(u,v)。
{u=fx(x′+αy′)+cxv=fyy′+cy \begin{cases} u = f_x(x' + \alpha y') + c_x \\ v = f_y y' + c_y \end{cases} {u=fx(x′+αy′)+cxv=fyy′+cy

这一步α是扭曲系数,fx,fy,cx,cy是鱼眼镜头的内参矩阵,作用是两个二维平面间的缩放和平移。缩放是要把物理单位转成像素单位,平移是坐标原点对齐。
fx,fyf_{x}, f_yfx,fy:x/y 方向的像素焦距(缩放系数)
cx,cyc_x, c_ycx,cy:主点(图像中心)的像素坐标
α\alphaα:扭曲系数,用于修正 x/y 轴的轻微不垂直
u,vu, vu,v:最终的图像像素坐标

3 IPM算法工程实现

参看链接:

https://www.cnblogs.com/fantasyzzz/p/16457219.html

https://blog.csdn.net/manyuan4374/article/details/148281116

相关推荐
kkeeper~8 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6669 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_8769641310 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚10 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本10 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov12 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫12 小时前
特征工程处理
人工智能·算法·机器学习
z落落12 小时前
C#参数区别
java·算法·c#
c2385613 小时前
vector(下)
数据结构·算法
z落落13 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法