4. 鱼眼图像去畸变

鱼眼相机以超大视场角为环视泊车提供“看得广”的优势,但代价是图像存在强烈的桶形畸变:直线被弯成弧线,近处物体被拉伸,远处目标被压缩。若直接把原始鱼眼图拼接成俯视图,车道线、车位线和障碍物轮廓都会严重变形,测距与定位随之失真。因此,去畸变是鱼眼环视与超声波融合泊车链路中不可跳过的一步,它把“广角但变形”的原始图像转换为“几何可信”的校正图像,为后续透视变换、鸟瞰拼接和超声波融合提供统一的空间基准。

一、畸变校正模型:从物理模型到多项式近似

鱼眼畸变校正的核心是建立“畸变图像坐标”与“理想针孔图像坐标”之间的映射关系。工程上最常用的是多项式径向畸变模型:给定理想归一化坐标 (x, y),先计算半径 r,再通过 θ 或 r 的多项式得到畸变半径 r_d,最后按比例缩放回像素坐标。常见形式包括等距投影模型、Kannala-Brandt 模型以及 OpenCV 的 fisheye 模型。

对于泊车环视,相机通常固定安装、焦距与安装角已知,因此更实用的做法是采用标定+查表:先用棋盘格标定得到内参和畸变系数,再离线生成一张“目标像素 → 源像素”的映射表。这样运行时只需查表采样,避免每帧重复求解非线性方程,兼顾精度与速度。

关键理解:去畸变不是“把图像拉直”这么简单,而是为每个输出像素找到它在原始鱼眼图中的正确采样位置。映射表就是这张“地址簿”。

二、映射表生成:离线计算,在线查表

映射表生成的一般流程如下:

  1. 确定输出图像尺寸与虚拟针孔相机内参(焦距、主点),即“希望得到怎样的无畸变视图”。
  2. 对输出图像每个像素 (u, v),反投影到归一化平面,得到理想坐标 (x, y)。
  3. 代入畸变模型,计算对应的畸变坐标 (x_d, y_d)。
  4. 用鱼眼相机内参把 (x_d, y_d) 映射回原始像素坐标 (u_s, v_s)。
  5. 将 (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。

鱼眼去畸变处理链路与映射关系 原始鱼眼图 桶形畸变,直线弯曲 标定参数 映射表生成 输出像素 → 源像素 map_x / map_y int16 定点存储 查表采样 插值方法 双线性 / 双三次 边界掩膜处理 无效区域标记 输出 校正图 直线恢复 实时性优化手段 离线查表 SIMD 并行 ROI 裁剪 GPU / ISP 卸载 降采样 + 定点化,降低带宽与算力 目标:单路 1080P < 8 ms,四路 30 fps 画质评估维度 几何精度:重投影误差 清晰度:MTF50 有效区域占比 拼接缝一致性 实时性:单路耗时与帧率余量 以标定误差和拼接效果为准,避免过度校正

总结来看,鱼眼去畸变的工程要点可以归纳为:模型决定几何正确性,映射表决定运行效率,插值决定画质细节,优化决定实时性,评估决定最终能否稳定支撑泊车融合。只有把这五者协同好,环视系统才能在真实车位中“看得广、看得准、看得快”。