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 不一样。

我的经验:工业相机里,dx 和 dy 差异通常在 1% 以内。但手机摄像头为了降低成本,有时会用矩形像素,导致 f_x 和 f_y 差几十个像素。标定时如果发现这个差异超过 5%,建议检查一下传感器规格书。

3.2 主点:光轴穿过的位置

理想情况下,光轴应该穿过图像的正中心。但现实嘛……

由于镜头安装误差、传感器封装偏移,光轴实际穿过的点——我们叫它主点 (cx, cy)——往往不在正中心。我遇到过一台相机,主点偏了 30 多个像素,如果不校正,测距误差直接飙到 5%。

主点的单位也是像素。比如一个 1920×1080 的图像,理想主点是 (960, 540)。实际标定出来可能是 (955, 538)。

避坑指南:我曾经用一张标定板只拍了中心区域,结果主点标定结果漂移了 20 像素。后来我要求标定板必须覆盖图像四个角,主点才稳定下来。记住:主点对畸变校正极其敏感,标定图片一定要覆盖全视场。

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),再用焦距缩放,最后加上主点偏移。

核心理解:K 矩阵只与相机内部结构有关,与相机在世界中的位置无关。所以叫“内参”。你换个三脚架位置,K 不变;但你拧一下镜头变焦环,K 就变了。

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 矩阵的来龙去脉串起来了:

内参矩阵 K 知识结构 物理焦距 f (mm) 镜头光学属性 像素尺寸 dx, dy 传感器物理规格 主点偏移 (cx, cy) 装配误差导致 f_x = f / dx, f_y = f / dy 单位从 mm 转换为 pixel 内参矩阵 K [f_x, 0, c_x; 0, f_y, c_y; 0, 0, 1] 3×3 上三角矩阵 应用:3D→2D 投影 / 畸变校正 / 三维重建 K 矩阵 + 畸变系数 + 外参 = 完整相机模型 标定 输出

3.6 实际项目中的 K 矩阵

我习惯在标定完成后,先看一眼 K 矩阵的这几个值:

  1. f_x 和 f_y 的比值:如果偏离 1 超过 2%,检查像素是不是矩形。
  2. c_x 和 c_y 是否接近图像中心:偏差超过 5% 图像宽度,可能是标定板没拍好。
  3. 倾斜因子 s:如果值大于 0.1,大概率是标定图片有系统误差。
一个小技巧:用 OpenCV 标定后,打印出 K 矩阵,用肉眼扫一眼。如果 f_x 和 f_y 差了几百甚至上千,先别急着用——回去检查标定板的角点检测有没有出错。我踩过这个坑,浪费了两天时间。

好了,K 矩阵就聊到这儿。记住:它是相机内部物理属性的数学浓缩。理解了它,后面的畸变模型和标定流程才能真的吃透。