4、相机标定基础:针孔模型、内参矩阵、外参矩阵、畸变模型(径向/切向)

说到相机标定,很多新手第一反应就是「拿个棋盘格拍几张照片,然后跑个脚本就完事了」。嗯,我当年也是这么想的。直到有一次在产线上,标定出来的结果怎么都对不上,点云投影偏差了十几个像素,排查了整整两天才发现——我对相机模型的理解压根就没到位。

说白了,相机标定就是搞清楚两件事:光线是怎么进来的,以及图像是怎么变形的。今天咱们就把这层窗户纸捅破。

核心要点:相机标定的本质,是建立从三维世界到二维像素的映射关系,并补偿镜头带来的畸变。

4.1 针孔模型——最朴素的成像原理

先聊聊最简单的成像模型。你想想看,一个暗箱,前面戳个小孔,光线穿过小孔在后面的感光面上成像——这就是针孔模型。虽然现在的ToF相机结构复杂得多,但底层的几何关系还是这套东西。

针孔模型的核心公式其实就一行:

// 从世界坐标到像素坐标的映射
// [u, v, 1]^T = K * [R|t] * [X, Y, Z, 1]^T

// 其中:
// [u, v] 是像素坐标
// [X, Y, Z] 是世界坐标
// K 是内参矩阵
// [R|t] 是外参矩阵

我在项目中遇到过一个问题:用针孔模型去拟合广角镜头的数据,结果边缘误差大得离谱。后来才意识到,针孔模型只适用于小视角、低畸变的理想情况。ToF相机虽然视角通常不大,但畸变依然存在,不能忽视。

4.2 内参矩阵——相机的「基因」

内参矩阵描述的是相机内部的光学特性。说白了,就是告诉你「光线穿过镜头后,在传感器上落在了哪个像素位置」。

内参矩阵 K 长这样:

K = [fx,  0, cx
      0, fy, cy
      0,  0,  1]

其中:

  • fx, fy:焦距在x和y方向上的像素当量。注意,这两个值不一定相等,尤其是传感器像素不是正方形的时候。
  • cx, cy:主点坐标,也就是光轴与传感器平面的交点。理想情况下在图像中心,但实际总有偏差。

个人经验:我建议标定完成后,先检查cx、cy是否接近图像中心的一半。如果偏差超过10个像素,要么是标定板没放正,要么是镜头装配有问题。我曾经在某个模组上发现cx偏了30个像素,拆开一看,传感器贴歪了。

4.3 外参矩阵——相机在哪儿、看哪儿

外参矩阵描述的是相机坐标系和世界坐标系之间的相对关系。它由两部分组成:旋转矩阵 R 和平移向量 t。

你想想看,同一个物体,从不同角度拍,它在图像上的位置肯定不一样。外参矩阵就是用来描述这个「角度差异」的。

// 外参矩阵 [R|t] 是一个 3x4 的矩阵
// R: 3x3 旋转矩阵
// t: 3x1 平移向量

// 世界坐标到相机坐标的转换
X_cam = R * X_world + t

我记得有一次做多相机联合标定,三个ToF相机要拼成一个完整的点云。外参稍微偏了0.1度,拼接处的点云就出现了明显的错位。嗯,这里要注意:旋转矩阵的精度直接影响三维重建的质量

4.4 畸变模型——镜头不是完美的

理想很丰满,现实很骨感。真实的镜头总会引入各种畸变。ToF相机虽然用的是特殊镜头,但畸变依然存在,只是程度不同而已。

4.4.1 径向畸变

径向畸变是镜头最普遍的畸变类型。说白了,就是光线经过透镜时,边缘的折射角度和中心不一样。表现为图像边缘的直线变弯了。

径向畸变的数学模型:

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^2 = x^2 + y^2
// k1, k2, k3 是径向畸变系数

这里有个坑:k3 通常只在鱼眼镜头或大畸变镜头中使用。对于ToF相机,一般只标定k1和k2就够了。我曾经见过有人把k3也加进去,结果过拟合,标定结果反而更差。

4.4.2 切向畸变

切向畸变是由于镜头和传感器平面不平行造成的。说白了,就是镜头装歪了。

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 是切向畸变系数

避坑指南:我曾经在标定一个ToF模组时,发现切向畸变系数p1、p2特别大。一开始以为是算法问题,反复标定了好几次都一样。后来拆开模组一看,镜头座上的一个螺丝没拧紧,镜头歪了。拧紧后重新标定,p1、p2直接降了一个数量级。

4.5 知识体系总览

为了让你更直观地理解这些概念之间的关系,我画了一张图:

相机标定知识体系 相机标定 几何模型 畸变补偿 针孔模型 内参矩阵 K 外参矩阵 [R|t] 径向畸变 (k1,k2,k3) 切向畸变 (p1,p2) 最终目标:建立精确的 3D→2D 映射关系 用于深度计算、点云生成、三维重建

4.6 标定流程中的关键点

了解了这些模型之后,标定流程就清晰了。我个人习惯的标定步骤是这样的:

  1. 采集标定板图像:至少20张,覆盖不同角度和距离。注意标定板要占画面1/4以上。
  2. 提取角点:用亚像素精度提取棋盘格角点。
  3. 初始化内参:用闭式解估算内参矩阵和畸变系数。
  4. 非线性优化:用Levenberg-Marquardt算法最小化重投影误差。
  5. 验证结果:用未参与标定的图像验证,重投影误差应小于0.5像素。

重要指标:重投影误差是衡量标定质量的核心指标。对于ToF相机,我一般要求重投影误差 < 0.3 像素。如果超过0.5像素,建议重新标定。

4.7 一个常见的误区

很多人以为标定一次就一劳永逸了。其实不然。ToF相机的镜头和传感器会随着温度变化发生微小的形变,导致内参漂移。我建议:

  • 量产前做一次高精度标定
  • 每3-6个月做一次复标
  • 如果相机经历过剧烈震动或温度冲击,立即重新标定

嗯,今天就聊到这儿。这些模型虽然看起来简单,但它们是整个ToF相机标定的基石。搞懂了这些,后面的畸变校正和深度校准才能顺利进行。


公众号:蓝海资料掘金营,微信deep3321