第1章:相机成像原理——小孔成像模型、透镜畸变与内参矩阵
大家好,我是你们这门课的主讲。今天咱们来聊聊相机成像这件事。
说实话,做自动驾驶感知这几年,我见过太多同学一上来就调模型、跑算法,结果连相机拍出来的图像是怎么来的都没搞明白。嗯,这其实是个大坑。你想想看,如果连传感器本身的特性都不清楚,后面那些复杂的感知算法,说白了就是空中楼阁。
所以,第一章咱们就踏踏实实地,把相机成像的底子打牢。
1.1 小孔成像模型——最朴素的相机
先问大家一个问题:相机是怎么把三维世界“塞”进一张二维照片里的?
最原始的想法,就是小孔成像。你拿一个密闭的盒子,在其中一个面上戳一个小孔,对面放一张感光底片。光线从物体上反射出来,穿过这个小孔,在底片上形成一个倒立的像。这就是小孔成像模型。
核心要点:小孔成像模型是理想化的线性模型。它假设所有光线都穿过一个点(光心),然后投影到成像平面上。
这个模型虽然简单,但它给了我们一个非常重要的数学关系——相似三角形。物体在现实世界中的大小、距离,和它在图像上的大小、距离,是成比例的。
用公式表达就是:
X_image = f * (X_world / Z_world)
Y_image = f * (Y_world / Z_world)
其中 f 是焦距(小孔到成像平面的距离),(X_world, Y_world, Z_world) 是物体在相机坐标系下的三维坐标,(X_image, Y_image) 是它在图像上的像素坐标。
我个人习惯把这个公式记成“近大远小”的数学版本。你在项目里标定相机的时候,本质上就是在求解这个 f 和图像中心点的位置。
1.2 透镜畸变——理想很丰满,现实很骨感
小孔成像模型很完美,对吧?但现实中的相机,没人用小孔。为什么?因为小孔进光量太少,拍出来的照片又暗又糊。
所以,我们给相机加上了透镜。透镜能汇聚光线,让更多光进入传感器,画面也清晰了。但代价是什么?畸变。
我记得有一次在路测的时候,发现车辆检测的框总是偏左。排查了半天,最后发现是相机畸变参数没标对。嗯,从那以后我再也不敢轻视畸变校正了。
径向畸变——画面“鼓起来”了
径向畸变,说白了就是光线经过透镜边缘时,弯曲程度和中心不一样。结果就是画面边缘的直线变弯了。
- 桶形畸变:画面像被吹胀的气球,直线向外弯曲。常见于广角镜头。
- 枕形畸变:画面像被向内挤压,直线向内弯曲。常见于长焦镜头。
数学上,我们用多项式来建模这种畸变:
x_distorted = x * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6)
y_distorted = y * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6)
这里的 r 是像素点到图像中心的距离,k1、k2、k3 就是径向畸变系数。一般用前两个就够了,k3 主要针对鱼眼镜头那种超大畸变的情况。
我的经验:标定径向畸变时,棋盘格一定要拍满整个视野。我曾经只拍了中心区域,结果边缘畸变完全没标出来,导致车道线检测在画面边缘全断了。
切向畸变——镜头装歪了
切向畸变,产生的原因更简单——镜头和成像平面不平行。说白了就是镜头装歪了,或者传感器贴歪了。
它的效果是:画面中的矩形会变成梯形,或者产生某种“倾斜”的感觉。
数学公式:
x_distorted = x + (2 * p1 * x * y + p2 * (r^2 + 2 * x^2))
y_distorted = y + (p1 * (r^2 + 2 * y^2) + 2 * p2 * x * y)
p1、p2 就是切向畸变系数。
注意:切向畸变通常比径向畸变小得多。如果你发现切向畸变系数很大,那大概率是相机模组本身有问题,建议直接换硬件。
1.3 相机内参矩阵(K矩阵)——把世界坐标变成像素坐标
好了,现在我们有了小孔成像模型,也知道了畸变怎么校正。但还有一个关键问题:图像上的坐标,单位是像素,不是毫米。怎么把物理世界中的点,映射到像素坐标上?
这就轮到内参矩阵 K 出场了。
K 矩阵是一个 3x3 的上三角矩阵:
K = | fx 0 cx |
| 0 fy cy |
| 0 0 1 |
其中:
- fx, fy:分别是 x 和 y 方向上的焦距(以像素为单位)。为什么有两个?因为像素通常不是正方形,x 和 y 方向的缩放可能不一样。
- cx, cy:是图像主点(光轴与成像平面的交点)的像素坐标。理想情况下在图像正中心,但实际会有偏移。
完整的投影过程是这样的:
| u | | fx 0 cx | | X_cam |
| v | = | 0 fy cy | * | Y_cam |
| 1 | | 0 0 1 | | Z_cam |
注意,这里的 (X_cam, Y_cam, Z_cam) 是相机坐标系下的三维坐标。这个坐标怎么来的?那是外参矩阵的事,咱们后面章节再讲。
一句话总结:内参矩阵 K 描述了相机本身的属性——焦距、像素尺寸、主点位置。它把相机坐标系下的三维点,投影到二维像素平面上。
1.4 完整的成像流程——从世界到像素
咱们把整个流程串起来,看看一张照片是怎么生成的:
- 世界坐标系 → 相机坐标系:通过外参矩阵(旋转+平移),把物体从世界坐标转到相机坐标。
- 相机坐标系 → 归一化平面:通过小孔成像模型,得到归一化坐标 (X/Z, Y/Z, 1)。
- 加入畸变:在归一化平面上,用径向和切向畸变系数,对坐标进行扭曲。
- 归一化平面 → 像素平面:通过内参矩阵 K,把畸变后的坐标映射到像素坐标。
你看,每一步都有明确的数学关系。这也是为什么我总跟团队说:感知系统不是玄学,是数学。
避坑指南:我曾经在融合激光雷达和相机数据时,发现投影总是对不上。查了两天,最后发现是畸变校正的顺序搞反了。记住:畸变校正一定要在投影到像素平面之前做,顺序不能乱。
1.5 本章小结
这一章咱们聊了三件事:
- 小孔成像模型是基础,它给出了“近大远小”的数学关系。
- 透镜畸变是现实,径向畸变让直线变弯,切向畸变让画面倾斜。
- 内参矩阵 K 是桥梁,把物理坐标和像素坐标连接起来。
下一章,咱们会深入聊聊相机标定的具体操作——怎么用棋盘格照片,把这些参数一个个算出来。到时候我会分享一些我在实际标定中踩过的坑,保证让你少走弯路。
好了,今天就到这儿。有问题欢迎留言讨论。