一、相机成像模型:从三维世界到二维像素
大家好,我是老张。做多传感器融合这些年,我最大的体会就是——标定是基础,而相机模型是标定的基石。今天咱们就来聊聊相机成像模型,说白了就是搞明白一件事:三维空间里的一个点,是怎么跑到相机照片上那个像素位置的。
我个人习惯把相机成像拆成两步走:第一步是物理投影,第二步是数字化采样。嗯,咱们一步步来看。
1.1 针孔相机模型
针孔相机模型,这是最经典的成像模型。你想想看,一个暗箱,前面戳个小孔,光线穿过小孔在后面的感光面上成像。这就是最朴素的相机原理。
数学上怎么描述?看这个公式:
// 三维点 P(X, Y, Z) 投影到成像平面
x = f * X / Z
y = f * Y / Z
这里 f 是焦距,也就是小孔到成像平面的距离。X、Y、Z 是三维点在相机坐标系下的坐标。x、y 是成像平面上的物理坐标。
核心要点:针孔模型本质上是相似三角形关系。Z 越大,成像越小——这就是近大远小的数学表达。
我在项目中遇到过一个问题:用针孔模型算出来的坐标,和实际图像总差那么几个像素。后来发现,真实相机不是理想针孔,镜头有畸变。这就引出了下一个话题。
1.2 畸变模型
真实镜头嘛,总归不是完美的。光线经过透镜会发生弯曲,这就产生了畸变。畸变主要分两类:径向畸变和切向畸变。
径向畸变
径向畸变,说白了就是光线在镜头边缘弯得更厉害。你拍一张棋盘格,会发现边缘的格子变弯了。我刚开始做标定时,就吃过这个亏——没考虑畸变,结果融合出来的点云全是歪的。
数学上,径向畸变用多项式来建模:
// 径向畸变校正
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)
其中 r 是像素到图像中心的距离,k1、k2、k3 是径向畸变系数。一般用 k1、k2 就够了,鱼眼镜头才需要 k3。
避坑指南:我曾经在标定一个广角镜头时,只用了 k1、k2,结果边缘误差一直降不下去。后来加上 k3,效果立竿见影。所以,畸变系数用几个,得看镜头类型。
切向畸变
切向畸变,是因为镜头和成像平面不平行造成的。说白了就是镜头装歪了。这个在工业相机里比较常见,消费级相机一般不明显。
// 切向畸变校正
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 就是切向畸变系数。实际标定时,我一般会同时标定径向和切向畸变,总共 5 个参数(k1、k2、p1、p2,再加一个 k3 可选)。
1.3 内参矩阵
好,现在我们把物理坐标转换成像素坐标。内参矩阵就是干这个活的。
// 内参矩阵 K
K = [fx, 0, cx,
0, fy, cy,
0, 0, 1]
这里:
- fx, fy:焦距在 x、y 方向上的像素尺度。为什么是两个?因为像素不一定是正方形的。
- cx, cy:主点坐标,也就是光轴与成像平面的交点。理想情况下在图像中心,但实际会有偏移。
内参矩阵的作用,就是把相机坐标系下的归一化坐标,映射到像素坐标:
// 像素坐标 = K * 归一化坐标
[u, v, 1]^T = K * [x/Z, y/Z, 1]^T
个人经验:我见过不少新手,标定完内参后直接拿来用,结果发现不同分辨率下结果不一样。为什么?因为 fx、fy、cx、cy 都是像素单位,分辨率变了,这些值也得重新算。嗯,这个坑我踩过。
1.4 外参矩阵
外参矩阵,描述的是相机在世界坐标系下的位置和朝向。说白了就是相机放在哪、朝哪看。
// 外参矩阵 [R|t]
// R: 3x3 旋转矩阵
// t: 3x1 平移向量
P_cam = R * P_world + t
外参矩阵把世界坐标系下的点,变换到相机坐标系下。然后才能用内参投影到像素。
我举个例子:你放了一个标定板在地上,标定板坐标系就是世界坐标系。外参矩阵告诉你,相机相对于标定板是偏了 30 度还是远了 1 米。
技巧分享:多传感器标定时,外参矩阵是核心。比如激光雷达和相机融合,你需要知道激光点云中的点,在相机图像中对应哪个像素。这就要靠外参矩阵把激光坐标系下的点,变换到相机坐标系下。
1.5 完整成像流程
把上面这些串起来,一个三维点变成像素坐标的完整流程是这样的:
- 世界坐标系 → 相机坐标系:用外参矩阵 [R|t] 变换
- 相机坐标系 → 归一化平面:除以 Z,得到归一化坐标 (x/Z, y/Z)
- 畸变校正:对归一化坐标应用径向和切向畸变模型
- 归一化平面 → 像素坐标:用内参矩阵 K 映射
下面这张图,是我自己画的一个流程图,帮你理清整个成像链路:
1.6 实际标定中的注意事项
讲了这么多理论,最后分享几个实战经验:
警告:标定板一定要平整!我曾经用一张打印在普通纸上的棋盘格标定,结果纸有点皱,标定出来的内参偏差很大。后来换了亚克力板做的标定板,效果立马好了。
- 图片数量:我一般拍 20-30 张不同角度的标定板图片。太少的话,标定结果不稳定。
- 覆盖范围:标定板要出现在图像的各个区域,尤其是边缘和角落。这样才能准确标定出畸变参数。
- 距离变化:标定板离相机远、近都要拍。远距离约束焦距,近距离约束畸变。
小技巧:标定完成后,记得做重投影误差检查。一般重投影误差小于 0.5 像素就算不错了。如果大于 1 个像素,建议重新标定。
好了,相机成像模型就聊到这儿。记住一句话:内参是相机的「身份证」,外参是相机的「GPS 定位」。搞懂了这两样,多传感器标定就迈出了最关键的一步。