3. 相机成像模型:针孔相机模型、畸变模型、内参矩阵与外参矩阵
各位同学好,我是你们这节课程的讲师。咱们今天聊的,是传感器标定里最基础、也最绕不开的一块——相机成像模型。
说实话,我入行那会儿,第一次接触相机标定,看着那些矩阵公式,头都是大的。后来在项目里摔过几次跟头,才真正明白这些公式背后的物理意义。今天我就用我的理解,把这块掰开了讲给你听。
3.1 针孔相机模型:最朴素的成像原理
先问大家一个问题:相机是怎么把三维世界“拍”成一张二维照片的?
最经典的模型,就是针孔相机模型。说白了,它就是一个带小孔的暗箱。光线从物体上反射过来,穿过这个小孔,在后面的感光平面上形成一个倒立的像。
嗯,这里要注意:实际相机用的是透镜,不是针孔。但针孔模型是数学上最简单的近似,所有更复杂的模型都是在这个基础上“打补丁”。
数学上,这个模型可以写成:
u = f * (X / Z) + u0
v = f * (Y / Z) + v0
其中 (X, Y, Z) 是物体在相机坐标系下的三维坐标,(u, v) 是像素坐标,f 是焦距,(u0, v0) 是光心在像素平面上的位置。
我个人习惯把这个公式记成“相似三角形”。你想想看,物体离相机越远(Z越大),它在图像上就越小,这不就是生活常识吗?
核心理解:针孔模型本质上是将三维空间中的点,通过中心投影,映射到二维平面上。这个映射是线性的,但前提是——没有畸变。
3.2 畸变模型:现实世界总是不完美的
理想很丰满,现实很骨感。实际相机用的透镜,不可能像针孔那么完美。光线经过透镜时会发生弯曲,导致图像变形,这就是畸变。
我在项目中遇到过最典型的例子:用广角镜头拍棋盘格,边缘的格子都弯了。如果不做畸变校正,车道线检测的精度直接崩掉。
畸变主要分两类:
3.2.1 径向畸变
这是最常见的一种。说白了,就是光线在透镜边缘比在中心弯得更厉害。它沿着镜头半径方向分布。
- 桶形畸变:图像边缘向外凸出,像木桶一样。广角镜头常见。
- 枕形畸变:图像边缘向内凹陷。长焦镜头常见。
数学上,我们用泰勒级数来近似:
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, y) 是归一化平面上的坐标,r 是到光心的距离,k1、k2、k3 是径向畸变系数。
我的经验:对于普通车载摄像头,一般用 k1 和 k2 就够了。k3 通常用于鱼眼镜头那种大畸变场景。别盲目加参数,过拟合反而会让标定结果变差。
3.2.2 切向畸变
这个畸变产生的原因,是透镜和成像平面不平行。说白了,就是镜头装歪了。
切向畸变的公式:
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]
p1、p2 就是切向畸变系数。
避坑指南:我曾经在标定一台工业相机时,发现径向畸变校正后图像还是歪的。排查了半天,发现是镜头安装座有0.1mm的间隙。切向畸变参数直接暴露了这个问题。所以,标定不只是数学问题,也是机械问题。
3.3 内参矩阵:相机自己的“身份证”
内参矩阵,描述的是相机内部的几何属性。它把相机坐标系下的点,映射到像素坐标系。
矩阵形式长这样:
K = | fx 0 cx |
| 0 fy cy |
| 0 0 1 |
- fx, fy:分别是x和y方向上的焦距(以像素为单位)。如果像素是正方形,fx = fy。
- cx, cy:光心在像素坐标系中的位置。理想情况下在图像中心,但实际会有偏移。
我建议你把这个矩阵理解为“从物理世界到像素世界的翻译官”。它告诉你:一个在相机前方1米处的点,到底对应图像上的哪个像素。
3.4 外参矩阵:相机在“世界”中的位置
外参矩阵,描述的是相机坐标系和世界坐标系之间的相对关系。说白了,就是相机放在哪、朝哪看。
它由一个旋转矩阵 R 和一个平移向量 t 组成:
[R | t]
其中 R 是 3x3 的旋转矩阵,t 是 3x1 的平移向量。
举个例子:在自动驾驶中,我们通常把世界坐标系原点放在车辆后轴中心。那么外参矩阵就描述了“相机相对于车辆后轴中心的位置和朝向”。
重要提醒:外参矩阵是标定中最容易出错的环节。我见过有人把旋转矩阵和平移向量的顺序搞反,结果投影出来的车道线飞到天上去了。记住:先旋转,再平移。
3.5 知识体系总览
为了让你更直观地理解这些概念之间的关系,我画了一张图:
3.6 完整投影公式
把上面所有东西串起来,一个三维世界点 P_w 到像素点 p 的完整投影过程就是:
1. 世界坐标 → 相机坐标:P_c = R * P_w + t
2. 相机坐标 → 归一化平面:x = X_c / Z_c, y = Y_c / Z_c
3. 畸变校正:x', y' = 畸变模型(x, y, k1, k2, k3, p1, p2)
4. 归一化平面 → 像素坐标:u = fx * x' + cx, v = fy * y' + cy
写成矩阵形式就是:
p = K * [R | t] * P_w
当然,别忘了中间还要插入畸变校正这一步。很多初学者会忽略这一点,直接用线性模型去算,结果就是——标定出来的车道线,在图像边缘偏差好几个像素。
我的建议:在实际工程中,不要只依赖理论公式。每次标定完,一定要做重投影误差检查。就是把标定板上的角点,用标定结果重新投影到图像上,看看和实际检测到的角点差多少像素。误差小于0.5像素,才算合格。
好了,这一节的内容就到这里。相机成像模型是传感器标定的基石,后面的所有章节都会用到这些概念。希望你能把针孔模型、畸变模型、内参外参这几个概念刻在脑子里。