3. 相机内参矩阵
聊完了针孔模型,咱们得把那个虚拟的成像平面,映射到真实的传感器上。说白了,就是要把物理世界里的毫米,换算成图像里的像素。
这个换算关系,就藏在内参矩阵 K 里。我当年刚接触标定时,觉得这东西就是一堆公式,后来调了半年相机才发现,理解 K 矩阵的每个参数,比背公式重要得多。
3.1 从物理坐标到像素坐标
先想一个问题:相机传感器上每个像素,对应物理世界的多大范围?
这取决于两个东西:
- 焦距 f:透镜到成像面的距离,单位是毫米。
- 像素尺寸 (dx, dy):每个像素在 x 和 y 方向上的物理宽度,单位是毫米/像素。
举个例子。假设焦距 f = 12 mm,像素尺寸 dx = 0.005 mm/pixel。那么,焦距在像素单位下就是:
f_x = f / dx = 12 / 0.005 = 2400 pixel
嗯,这里要注意:f_x 和 f_y 通常不相等。为什么?因为像素不一定是正方形。很多 CMOS 传感器的像素是矩形的,dx 和 dy 不一样。
3.2 主点:光轴穿过的位置
理想情况下,光轴应该穿过图像的正中心。但现实嘛……
由于镜头安装误差、传感器封装偏移,光轴实际穿过的点——我们叫它主点 (cx, cy)——往往不在正中心。我遇到过一台相机,主点偏了 30 多个像素,如果不校正,测距误差直接飙到 5%。
主点的单位也是像素。比如一个 1920×1080 的图像,理想主点是 (960, 540)。实际标定出来可能是 (955, 538)。
3.3 内参矩阵 K 的数学定义
好了,把上面这些参数拼起来,就得到了内参矩阵 K:
K = [ f_x 0 c_x ]
[ 0 f_y c_y ]
[ 0 0 1 ]
这个 3×3 矩阵,把相机坐标系下的点 (X, Y, Z) 映射到像素坐标 (u, v):
s * [u] = K * [X]
[v] [Y]
[1] [Z]
其中 s 是尺度因子(其实就是 Z 值)。展开写就是:
u = f_x * (X/Z) + c_x
v = f_y * (Y/Z) + c_y
说白了,就是先把 3D 点投影到归一化平面 (X/Z, Y/Z),再用焦距缩放,最后加上主点偏移。
3.4 参数对比一览
| 参数 | 符号 | 单位 | 典型值(举例) | 影响因素 |
|---|---|---|---|---|
| 焦距(x方向) | f_x | 像素 | 2400 | 镜头焦距、像素尺寸 |
| 焦距(y方向) | f_y | 像素 | 2405 | 像素矩形比 |
| 主点(x方向) | c_x | 像素 | 960 | 传感器安装偏移 |
| 主点(y方向) | c_y | 像素 | 540 | 传感器安装偏移 |
| 倾斜因子 | s | — | 0 | 传感器歪斜(现代相机≈0) |
表格里有个“倾斜因子 s”,老式相机或扫描仪会有,现代 CMOS 基本可以忽略。标定时如果发现 s 很大,先检查标定板图片是不是拍歪了。
3.5 内参矩阵知识结构
下面这张图,把 K 矩阵的来龙去脉串起来了:
3.6 实际项目中的 K 矩阵
我习惯在标定完成后,先看一眼 K 矩阵的这几个值:
- f_x 和 f_y 的比值:如果偏离 1 超过 2%,检查像素是不是矩形。
- c_x 和 c_y 是否接近图像中心:偏差超过 5% 图像宽度,可能是标定板没拍好。
- 倾斜因子 s:如果值大于 0.1,大概率是标定图片有系统误差。
好了,K 矩阵就聊到这儿。记住:它是相机内部物理属性的数学浓缩。理解了它,后面的畸变模型和标定流程才能真的吃透。