4、环视相机配置与标定:环视相机布局、鱼眼相机模型、畸变校正、联合标定流程

环视相机系统,说白了就是给车装上「眼睛」。而且不是一只,是六只、八只甚至更多。我最早接触这个项目时,觉得不就是装几个摄像头嘛,结果一上手才发现——布局、选型、标定,每一步都是坑。

今天咱们就聊聊环视相机的配置与标定。这部分内容,是BEV感知的基石。搞不定它,后面的模型训练、融合推理,全是空中楼阁。

4.1 环视相机布局:怎么装才合理?

先说说布局。你想想看,一辆车要感知周围360度的环境,摄像头该怎么放?

常见的方案是6个摄像头:前视、后视、左前、右前、左后、右后。也有用8个的,比如再加两个侧视。我个人习惯,6个就够用,关键是重叠区域要够。

布局时要注意几个点:

  • 安装高度:一般1.2米到1.5米。太低了视野受限,太高了近处盲区大。我在项目中遇到过,某款车把摄像头装在车顶行李架旁边,结果近处地面完全看不到,标定都标不了。
  • 俯仰角:前视一般向下倾斜5-10度,后视也是。侧视要兼顾近处和远处,我建议倾斜角度控制在15度以内。
  • 重叠区域:相邻相机的视野重叠至少要30%。为什么?因为后面做联合标定、做BEV拼接,全靠重叠区域的特征点。重叠不够,标定精度直接崩。
  • 遮挡问题:别让A柱、后视镜挡住摄像头。嗯,这里要注意,有些车造型很激进,摄像头装的位置看着好看,实际用起来全是遮挡。

核心原则:环视相机布局,不是「能看见就行」,而是「能看见且能标定」。标定是前提,布局要为标定服务。

4.2 鱼眼相机模型:为什么它这么「弯」?

环视相机大多用鱼眼镜头。为什么?因为视野大啊,一个鱼眼能覆盖180度甚至220度。但代价是什么?畸变严重。

鱼眼相机的成像模型,和普通针孔相机不一样。针孔模型是直线投影,鱼眼是等距投影、等立体角投影这些。说白了,就是光线经过鱼眼镜头后,被「掰弯」了。

常见的鱼眼模型有几种:

模型名称 投影公式 特点
等距投影 r = fθ 最常用,畸变均匀
等立体角投影 r = 2f sin(θ/2) 亮度均匀性好
正交投影 r = f sinθ 视野边缘压缩严重
体视投影 r = 2f tan(θ/2) 模拟人眼效果

实际项目中,用得最多的是等距投影。为什么?因为它的畸变分布最均匀,后续校正起来好处理。我记得有一次,供应商给了个正交投影的鱼眼,结果边缘畸变太大,校正后图像质量惨不忍睹。从那以后,我坚决要求用等距投影。

4.3 畸变校正:把「弯」的掰直

鱼眼图像直接拿来用?不行。你得先做畸变校正。

畸变校正分两步:

  1. 内参标定:用棋盘格标定板,拍多张不同角度的照片,解算出相机的内参和畸变系数。
  2. 图像重映射:根据内参和畸变系数,把原始图像上的每个像素,映射到校正后的位置。

代码实现其实不复杂,OpenCV里就有现成的函数:

import cv2
import numpy as np

# 假设你已经标定好了内参和畸变系数
K = np.array([[fx, 0, cx],
              [0, fy, cy],
              [0, 0, 1]])
D = np.array([k1, k2, k3, k4])  # 鱼眼畸变系数

# 生成校正映射
map1, map2 = cv2.fisheye.initUndistortRectifyMap(
    K, D, np.eye(3), K, (width, height), cv2.CV_16SC2
)

# 应用映射
undistorted_img = cv2.remap(img, map1, map2, cv2.INTER_LINEAR)

小技巧:校正后的图像,边缘部分会被裁剪掉。如果你需要保留全部视野,可以调整内参矩阵中的焦距,让校正后的图像稍微缩小一点。我一般把焦距乘以0.8,效果不错。

这里有个坑——鱼眼相机的畸变系数是4个(k1, k2, k3, k4),不是普通相机的5个(k1, k2, p1, p2, k3)。别搞混了。我曾经见过有人用普通相机的标定方法去标鱼眼,结果校正出来的图像全是波浪,折腾了两天才发现是模型用错了。

4.4 联合标定流程:让所有相机「对齐」

单相机标定完了,接下来是联合标定。说白了,就是让所有相机知道彼此的位置关系。

联合标定的目标是:求出每个相机到车体坐标系的外参(旋转矩阵R和平移向量T)。

流程大概是这样的:

  1. 准备标定场地:地面铺上标定布,或者画好标定图案。我建议用那种带二维码的标定布,自动检测特征点,省时省力。
  2. 采集数据:把车开到标定场地,每个相机拍一张照片。注意,车要停正,地面要平整。
  3. 特征点提取:从每张图像中提取标定图案的特征点(比如角点、二维码中心点)。
  4. 建立对应关系:把图像上的特征点,和实际地面上的物理坐标对应起来。
  5. 求解外参:用PnP算法或者优化方法,求解每个相机的外参。

这里有个关键点——联合标定需要「全局一致性」。什么意思?就是所有相机的外参,要能拼出一个完整的、无缝隙的环视图像。如果某个相机的外参偏了1度,拼接出来的图像就会错位。

注意:联合标定不是一次就能搞定的。我建议做两轮:第一轮粗标定,第二轮精标定。粗标定用特征点匹配,精标定用光度一致性优化。两轮下来,精度基本能控制在0.1度以内。

实际项目中,我遇到过最头疼的问题是什么?是标定板的摆放。你想想看,6个相机,每个相机的视野都不一样,你要让标定板同时出现在多个相机的视野里。这需要精心设计标定板的尺寸和位置。我的经验是:用大标定板(1.5米×1.5米),放在相邻相机的重叠区域,一次标定两个相机。

4.5 实战中的那些坑

最后,分享几个我踩过的坑:

  • 温度影响:摄像头在高温下,内参会漂移。夏天暴晒后,标定参数就不准了。我建议做温度补偿,或者选用温度稳定性好的镜头。
  • 震动影响:车辆行驶中的震动,会让摄像头松动。定期检查标定参数,必要时重新标定。
  • 镜头脏污:泥水、灰尘会严重影响图像质量。嗯,这个没办法,只能靠自动清洗系统或者定期维护。
  • 标定场地不平:地面有坡度,标定出来的外参就是错的。我建议用水平仪检查场地,或者用激光雷达辅助标定。

环视相机配置与标定,说难不难,说简单也不简单。关键是要理解原理,然后多动手。我刚开始做的时候,光标定就折腾了一个月。现在回头看,那些坑都是宝贵的经验。希望你能少走弯路。