4. 鱼眼图像去畸变
鱼眼相机以超大视场角为环视泊车提供“看得广”的优势,但代价是图像存在强烈的桶形畸变:直线被弯成弧线,近处物体被拉伸,远处目标被压缩。若直接把原始鱼眼图拼接成俯视图,车道线、车位线和障碍物轮廓都会严重变形,测距与定位随之失真。因此,去畸变是鱼眼环视与超声波融合泊车链路中不可跳过的一步,它把“广角但变形”的原始图像转换为“几何可信”的校正图像,为后续透视变换、鸟瞰拼接和超声波融合提供统一的空间基准。
一、畸变校正模型:从物理模型到多项式近似
鱼眼畸变校正的核心是建立“畸变图像坐标”与“理想针孔图像坐标”之间的映射关系。工程上最常用的是多项式径向畸变模型:给定理想归一化坐标 (x, y),先计算半径 r,再通过 θ 或 r 的多项式得到畸变半径 r_d,最后按比例缩放回像素坐标。常见形式包括等距投影模型、Kannala-Brandt 模型以及 OpenCV 的 fisheye 模型。
对于泊车环视,相机通常固定安装、焦距与安装角已知,因此更实用的做法是采用标定+查表:先用棋盘格标定得到内参和畸变系数,再离线生成一张“目标像素 → 源像素”的映射表。这样运行时只需查表采样,避免每帧重复求解非线性方程,兼顾精度与速度。
二、映射表生成:离线计算,在线查表
映射表生成的一般流程如下:
- 确定输出图像尺寸与虚拟针孔相机内参(焦距、主点),即“希望得到怎样的无畸变视图”。
- 对输出图像每个像素 (u, v),反投影到归一化平面,得到理想坐标 (x, y)。
- 代入畸变模型,计算对应的畸变坐标 (x_d, y_d)。
- 用鱼眼相机内参把 (x_d, y_d) 映射回原始像素坐标 (u_s, v_s)。
- 将 (u_s, v_s) 以定点或浮点格式写入映射表,供实时采样使用。
映射表通常包含 map_x 与 map_y 两个通道,尺寸与输出图像一致。若输出为 1280×720,单通道 float32 约 3.6 MB,双通道约 7.2 MB;若改为 int16 定点表示,可压缩到约 3.6 MB,适合嵌入式平台缓存。对于多路鱼眼,每路相机各有一张表,需按相机编号管理。
// 映射表生成伪代码
for v in 0..H_out:
for u in 0..W_out:
x = (u - cx_out) / fx_out
y = (v - cy_out) / fy_out
r = sqrt(x*x + y*y)
theta = atan(r)
theta_d = theta * (1 + k1*theta^2 + k2*theta^4 + k3*theta^6 + k4*theta^8)
scale = (r > 1e-6) ? theta_d / r : 1.0
x_d = x * scale
y_d = y * scale
u_s = fx_in * x_d + cx_in
v_s = fy_in * y_d + cy_in
map_x[v][u] = u_s
map_y[v][u] = v_s
三、插值方法:双线性、双三次与边缘保护
映射得到的源坐标通常不是整数,必须插值。最常用的是双线性插值:取周围 4 个像素加权平均,速度快、实现简单,但在强畸变边缘容易产生轻微模糊。若对画质要求更高,可用双三次插值,取 4×4 邻域,边缘更锐利,但计算量约为双线性的 4 倍。对于泊车场景,车道线和车位线是重要特征,过度模糊会影响后续检测,因此在中高端平台可优先双三次,在低算力平台用双线性并配合锐化补偿。
另一个易被忽视的问题是边界处理:去畸变后图像四角可能超出原始鱼眼有效区域,若直接采样会得到黑边或错误像素。工程上通常将无效区域标记为 0 或 255,并在拼接阶段做掩膜融合,避免黑边进入鸟瞰图。
四、实时性优化与画质评估
去畸变是环视链路中计算量较大的环节之一,尤其四路 1080P 同时处理时。常见优化手段包括:
- 查表替代实时计算:把非线性模型求解移到离线,运行时只做采样。
- 定点化与 SIMD:将 map_x/map_y 转为 int16,利用 NEON 或 SSE 并行处理 8/16 像素。
- 降低输出分辨率:泊车俯视图对分辨率要求低于原始感知图,可先降采样再去畸变。
- ROI 裁剪:只对有效环视区域生成映射表,减少无效像素计算。
- GPU/专用 ISP:把 remap 操作卸载到 GPU 或相机 ISP 的畸变校正模块。
画质评估不能只看“看起来直不直”。建议从以下维度量化:
| 评估维度 | 指标 | 目标参考 |
|---|---|---|
| 几何精度 | 棋盘格角点重投影误差 | < 0.5 像素 |
| 边缘清晰度 | MTF50 或拉普拉斯方差 | 不低于原始图 80% |
| 有效区域 | 无黑边/无效像素占比 | < 2% |
| 实时性 | 单路 1080P 耗时 | < 8 ms(30 fps 余量) |
| 一致性 | 四路拼接缝错位 | < 2 像素 |
五、案例:四路鱼眼去畸变在泊车中的落地
某量产泊车项目使用 4 颗 190° 鱼眼相机,原始输出 1280×960。离线阶段用棋盘格标定得到每路内参与畸变系数,生成 640×480 的映射表,采用 int16 定点存储,单表约 1.2 MB。运行时在 SoC 的 DSP 上执行 remap,双线性插值,单路耗时约 5 ms,四路并行约 12 ms,满足 30 fps 要求。去畸变后图像送入透视变换生成鸟瞰图,再与超声波雷达点云融合。复盘发现,最初使用双线性且未做边界掩膜,导致拼接缝处出现黑边和轻微错位;加入无效区域掩膜并改用双三次插值后,车位线连续性明显改善,融合定位误差从 15 cm 降至 8 cm。
总结来看,鱼眼去畸变的工程要点可以归纳为:模型决定几何正确性,映射表决定运行效率,插值决定画质细节,优化决定实时性,评估决定最终能否稳定支撑泊车融合。只有把这五者协同好,环视系统才能在真实车位中“看得广、看得准、看得快”。