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 畸变校正:把「弯」的掰直
鱼眼图像直接拿来用?不行。你得先做畸变校正。
畸变校正分两步:
- 内参标定:用棋盘格标定板,拍多张不同角度的照片,解算出相机的内参和畸变系数。
- 图像重映射:根据内参和畸变系数,把原始图像上的每个像素,映射到校正后的位置。
代码实现其实不复杂,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)。
流程大概是这样的:
- 准备标定场地:地面铺上标定布,或者画好标定图案。我建议用那种带二维码的标定布,自动检测特征点,省时省力。
- 采集数据:把车开到标定场地,每个相机拍一张照片。注意,车要停正,地面要平整。
- 特征点提取:从每张图像中提取标定图案的特征点(比如角点、二维码中心点)。
- 建立对应关系:把图像上的特征点,和实际地面上的物理坐标对应起来。
- 求解外参:用PnP算法或者优化方法,求解每个相机的外参。
这里有个关键点——联合标定需要「全局一致性」。什么意思?就是所有相机的外参,要能拼出一个完整的、无缝隙的环视图像。如果某个相机的外参偏了1度,拼接出来的图像就会错位。
注意:联合标定不是一次就能搞定的。我建议做两轮:第一轮粗标定,第二轮精标定。粗标定用特征点匹配,精标定用光度一致性优化。两轮下来,精度基本能控制在0.1度以内。
实际项目中,我遇到过最头疼的问题是什么?是标定板的摆放。你想想看,6个相机,每个相机的视野都不一样,你要让标定板同时出现在多个相机的视野里。这需要精心设计标定板的尺寸和位置。我的经验是:用大标定板(1.5米×1.5米),放在相邻相机的重叠区域,一次标定两个相机。
4.5 实战中的那些坑
最后,分享几个我踩过的坑:
- 温度影响:摄像头在高温下,内参会漂移。夏天暴晒后,标定参数就不准了。我建议做温度补偿,或者选用温度稳定性好的镜头。
- 震动影响:车辆行驶中的震动,会让摄像头松动。定期检查标定参数,必要时重新标定。
- 镜头脏污:泥水、灰尘会严重影响图像质量。嗯,这个没办法,只能靠自动清洗系统或者定期维护。
- 标定场地不平:地面有坡度,标定出来的外参就是错的。我建议用水平仪检查场地,或者用激光雷达辅助标定。
环视相机配置与标定,说难不难,说简单也不简单。关键是要理解原理,然后多动手。我刚开始做的时候,光标定就折腾了一个月。现在回头看,那些坑都是宝贵的经验。希望你能少走弯路。