3、传感器基础(二):鱼眼摄像头的工作原理、畸变校正、环视系统构成
好,咱们接着聊传感器。上一章我把毫米波雷达和激光雷达的底裤扒得差不多了,这一章咱们聚焦一个在自动泊车里真正“挑大梁”的传感器——鱼眼摄像头。
说实话,在泊车场景下,激光雷达虽然精度高,但成本摆在那。毫米波雷达对静态物体又不太敏感。真正让量产车实现“看得见、看得全”的,就是这四个装在车头、车尾、左右后视镜下的鱼眼摄像头。我参与过的几个量产项目,环视系统几乎是标配,没有它,自动泊车就是瞎子摸象。
3.1 鱼眼摄像头的工作原理
先说说它为什么叫“鱼眼”。你想想看,鱼在水里看岸上的世界,视角接近180度甚至更大。鱼眼摄像头模仿的就是这种超广角视觉。
它的核心原理其实不复杂:通过前镜片组的强折射,把大范围的光线压缩到小尺寸的CMOS传感器上。普通摄像头的视角大概在60-90度,而鱼眼能做到180度甚至220度。
关键参数:
- 焦距:通常在2mm以下,极短焦距才能实现大视场角
- 视场角(FOV):水平≥180°,垂直≥120°
- 畸变率:极高,通常在30%-60%之间
我在项目中遇到过一个问题:某款鱼眼摄像头标称FOV是190度,但实际装车后发现车头正下方有盲区。后来排查发现,是镜头安装角度偏了2度。嗯,这种细节往往容易被忽略,但恰恰是量产时的大坑。
鱼眼摄像头的光学模型,主流有两种:等距投影模型和等立体角投影模型。自动泊车领域用得最多的是等距投影模型,因为它能保证“入射角与像高成正比”,方便后续做畸变校正的数学建模。
3.2 畸变校正——从“哈哈镜”到“正常画面”
鱼眼摄像头拍出来的原始图像,说白了就是一张“哈哈镜”效果的照片。中间正常,边缘严重拉伸变形。这种图像直接拿来做泊车感知?那肯定不行。你想想看,如果车位线在边缘都弯成弧线了,算法怎么判断能不能停进去?
所以,畸变校正是绕不开的一步。
3.2.1 畸变的来源
畸变主要分两种:
- 径向畸变:光线经过透镜时,边缘折射比中心更厉害,导致直线变弯
- 切向畸变:镜头与CMOS传感器不平行,导致图像倾斜
鱼眼摄像头以径向畸变为主,切向畸变相对较小。我习惯在校正时先处理径向,再微调切向,顺序搞反了效果会差很多。
3.2.2 校正流程
畸变校正的流程,我总结为三步:
- 标定:用棋盘格拍摄多张不同角度的图像,提取角点,计算内参矩阵和畸变系数
- 映射:根据畸变模型,建立“畸变图像坐标”到“校正图像坐标”的映射表
- 插值:因为映射后的坐标可能是小数,需要用双线性插值或最近邻插值填充像素
给你看一段我常用的校正代码片段,基于OpenCV实现:
import cv2
import numpy as np
# 读取标定参数(假设已经标定好)
K = np.array([[320, 0, 320],
[0, 320, 240],
[0, 0, 1]], dtype=np.float32)
D = np.array([-0.3, 0.1, 0.0, 0.0], dtype=np.float32) # 畸变系数
# 读取鱼眼图像
img = cv2.imread('fisheye.jpg')
h, w = img.shape[:2]
# 生成校正映射表
map1, map2 = cv2.fisheye.initUndistortRectifyMap(
K, D, np.eye(3), K, (w, h), cv2.CV_16SC2)
# 应用映射
undistorted = cv2.remap(img, map1, map2,
interpolation=cv2.INTER_LINEAR)
cv2.imwrite('undistorted.jpg', undistorted)
我的经验:标定棋盘格不要用A4纸打印贴在硬纸板上,那样容易翘边。我建议用亚克力板或者玻璃板,保证棋盘格绝对平整。曾经有一次标定结果总是不收敛,最后发现是棋盘格贴歪了0.5mm——这种坑,踩过一次就记住了。
3.3 环视系统构成
单颗鱼眼摄像头能看180度,但车周围有360度。怎么办?用四颗鱼眼拼起来。这就是环视系统(Around View Monitor, AVM)的基本思路。
3.3.1 硬件构成
一套完整的环视系统,通常包括:
- 4颗鱼眼摄像头:前、后、左、右各一颗,FOV≥180°
- 图像处理芯片:负责畸变校正、视角变换、图像拼接
- 通信接口:常用GMSL或FPD-Link,传输高清视频流
- 标定工具:用于联合标定四颗摄像头的外参
我记得有一次在实车测试时,发现左摄像头画面和右摄像头画面在车头处重叠区域有重影。排查了半天,发现是左右摄像头的安装高度差了3mm。你想想看,3mm的误差在图像上可能就差了十几个像素,拼接时就会产生明显的接缝。
3.3.2 软件流程
环视系统的软件处理流程,我习惯这么划分:
- 单帧校正:对每颗鱼眼图像做畸变校正
- 视角变换:将校正后的图像投影到“鸟瞰图”视角(BEV)
- 图像拼接:根据标定好的外参,将四张BEV图融合成一张完整的环视图
- 后处理:亮度均衡、接缝融合、动态物体去除
注意:拼接时最怕的是“鬼影”——同一个物体在两颗摄像头重叠区域出现两次。解决办法是做好曝光同步和增益匹配。我曾经在项目中因为左右摄像头自动曝光参数不一致,导致拼接处出现明显的亮度跳变,后来强制固定了曝光时间才解决。
3.3.3 标定是灵魂
环视系统好不好用,90%取决于标定精度。标定分为:
- 内参标定:每颗摄像头自己的焦距、主点、畸变系数
- 外参标定:四颗摄像头之间的相对位置和姿态
外参标定通常需要在地面铺设标定布,上面有棋盘格或圆点阵列。车辆停在标定布中央,四颗摄像头同时拍摄,然后通过特征点匹配计算出外参矩阵。
我个人习惯在标定完成后,做一次“验证测试”:在车周围放几个已知坐标的锥桶,看环视图像中锥桶的位置是否与实际一致。如果偏差超过5cm,我会重新标定。嗯,这个标准可能比行业要求严一些,但自动泊车对精度要求就是这么高。
3.4 小结
鱼眼摄像头和环视系统,是自动泊车的“眼睛”。没有它们,后面的路径规划、控制执行都是空谈。这一章我们聊了:
- 鱼眼的工作原理——超广角、强折射、大畸变
- 畸变校正——从哈哈镜到正常画面,标定和插值是关键
- 环视系统构成——四颗鱼眼+芯片+标定,拼接出360度鸟瞰图
下一章,我会带你深入传感器融合的“大脑”——数据融合算法。到时候咱们聊聊,怎么把摄像头、雷达、超声波的数据揉在一起,让车真正“看懂”周围环境。
公众号:蓝海资料掘金营,微信deep3321