第二章 光学成像基础:透镜成像原理、焦距与视场角(FOV)、光圈与景深、像差(球差、色差、畸变)
各位同学,欢迎来到第二章。这一章我们聊聊光学成像的底层逻辑。说实话,很多做视觉算法的同事,对这部分内容不太上心,觉得「反正图像传感器会帮我搞定」。但我个人的经验是——不懂光学,你永远调不好算法。尤其是车载场景,光线变化剧烈,镜头质量参差不齐,你写的算法在实验室跑得飞起,一上车就崩,多半是没吃透这些基础。
2.1 透镜成像原理
先问个问题:为什么镜头能把远处的景物「拉」到传感器上?
核心就是凸透镜的折射。光线穿过透镜时,会发生偏折。平行于光轴的光线,会汇聚到一点,那就是焦点。焦点到透镜中心的距离,就是焦距。
成像公式很简单:
1/f = 1/u + 1/v
其中 f 是焦距,u 是物距,v 是像距。车载摄像头通常拍的是远处物体(u 很大),所以 1/u 趋近于 0,像距 v 就约等于焦距 f。也就是说,远处的景物,直接成像在焦平面上。
重要结论:车载摄像头一般对焦到无穷远。这意味着,从几米到几百米外的物体,理论上都能清晰成像。但实际中,镜头工艺和传感器像素尺寸会限制这个「清晰范围」。
我记得刚入行时,有个项目用了一款廉价镜头,标称焦距 6mm。结果实车测试,50米外的车牌模糊得没法看。后来一测,实际焦距偏差了 0.3mm。嗯,这就是为什么我后来选镜头,一定要求供应商提供实测焦距报告。
2.2 焦距与视场角(FOV)
焦距和视场角,是一对冤家。焦距越长,视场角越小,看得越远;焦距越短,视场角越大,看得越宽。
计算公式:
FOV = 2 * arctan( sensor_size / (2 * f) )
举个例子,车载常用的 1/3 英寸传感器(对角线约 6mm),配 6mm 镜头:
FOV ≈ 2 * arctan( 6 / (2 * 6) ) = 2 * arctan(0.5) ≈ 53°
这个视场角,大概相当于人眼单眼的视野范围。所以很多前视摄像头用这个配置。
| 应用场景 | 典型焦距 | 典型FOV | 特点 |
|---|---|---|---|
| 前视主摄像头 | 6mm - 8mm | 40° - 60° | 看得远,畸变小 |
| 环视/鱼眼 | 2mm - 3mm | 120° - 190° | 看得宽,畸变大 |
| 侧视/后视 | 4mm - 6mm | 60° - 90° | 兼顾距离和宽度 |
我的经验:选焦距时,别只看 FOV 数字。要结合像素密度来算。比如 200 万像素传感器,配 6mm 镜头,在 100 米处一个车牌大概占 30 个像素。这个分辨率够不够做识别?你自己算算。
2.3 光圈与景深
光圈,就是镜头里那个可以开合的「瞳孔」。用 F 值表示,比如 F1.4、F2.0。F 值越小,光圈越大,进光量越多。
景深呢?说白了就是清晰的前后范围。光圈越大,景深越浅;光圈越小,景深越深。
车载摄像头有个特殊要求:大景深。因为车前面的物体,从几米到几百米,都得看清楚。所以车载镜头的光圈通常不大,F2.0 到 F2.8 比较常见。
注意:光圈不是越小越好。光圈太小(比如 F8.0),进光量不足,夜间图像噪点会爆炸。我曾经在一个夜视项目中,为了追求景深把光圈收到 F5.6,结果晚上图像全是雪花点。后来改回 F2.0,配合 ISP 的降噪,效果好了很多。
景深还和物距有关。物体越近,景深越浅。所以车载摄像头对近处物体的清晰度要求很高——你想想看,如果 3 米外有个行人,结果因为景深不够拍模糊了,那算法再强也救不回来。
2.4 像差(球差、色差、畸变)
理想透镜只存在于课本里。现实中的镜头,都有各种像差。我把它分成三类:
2.4.1 球差
球差,就是透镜边缘和中心对光线的折射能力不一样。边缘光线聚焦得近一些,中心光线聚焦得远一些。结果就是——一个点变成了一个模糊的圆。
怎么解决?
- 用非球面透镜。这是目前车载镜头的主流方案。
- 缩小光圈。光圈小了,边缘光线被挡住,球差自然减轻。
我记得有一次,供应商送来的镜头样品,中心清晰度很好,但边缘一塌糊涂。一查,就是球差没校正到位。后来换了非球面镜片,问题解决。
2.4.2 色差
色差,说白了就是不同颜色的光折射率不同。蓝光折射得厉害,红光折射得弱一些。结果就是,一个白色物体边缘会出现红蓝「镶边」。
色差分两种:
- 轴向色差:不同颜色聚焦在不同平面上。
- 横向色差:不同颜色成像在传感器上的位置不同。
车载摄像头对色差很敏感。因为算法要识别交通灯、刹车灯,颜色不准会出大问题。
避坑指南:我曾经在一个项目中,发现算法对红色交通灯的识别率偏低。排查了很久,最后发现是镜头色差导致红色光晕扩散到了相邻像素。后来在 ISP 里加了色差校正,识别率从 85% 提升到了 97%。
2.4.3 畸变
畸变,就是直线变弯了。分两种:
- 桶形畸变:画面中间向外凸,像桶一样。常见于广角镜头。
- 枕形畸变:画面四角向内凹,像枕头。常见于长焦镜头。
车载摄像头中,鱼眼镜头的畸变最严重,可以达到 50% 以上。但这不是坏事——鱼眼就是为了获得超大视场角,畸变是「有意为之」的。
不过,算法层面必须做畸变校正。否则,你检测到的物体位置和实际位置会差很多。
// 畸变校正的数学模型(简化版)
// 径向畸变:
x_corrected = x * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6)
y_corrected = y * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6)
// 切向畸变:
x_corrected = x + [2 * p1 * x * y + p2 * (r^2 + 2 * x^2)]
y_corrected = y + [p1 * (r^2 + 2 * y^2) + 2 * p2 * x * y]
这里的 k1、k2、k3 是径向畸变系数,p1、p2 是切向畸变系数。这些参数需要标定得到。
核心观点:畸变校正不是「可选项」,而是「必选项」。尤其是做测距和目标定位的算法,不校正畸变,误差会大到离谱。我见过一个团队,在环视拼接时没做畸变校正,结果地面上的车道线在拼接处断开了 20 厘米。这种问题,实车测试时一眼就能看出来。
小结
这一章的内容,说白了就是一句话:镜头不是完美的,但我们可以理解它的不完美,然后用算法去弥补。
焦距决定你看多远,FOV 决定你看多宽,光圈和景深决定你看多清楚,像差决定你看得多准。这四个维度,是车载摄像头选型和算法设计的底层约束。
下一章,我们会聊传感器——CMOS 是怎么把光变成电信号的。到时候你会发现,光学和电学的问题,其实是连在一起的。