2. 相机标定基础:相机成像模型与参数解析

做三维重建,第一步就是搞清楚相机是怎么“看”世界的。

说白了,相机就是一个把三维空间投影到二维平面的装置。这个投影过程,我们用一个数学模型来描述——就是经典的针孔模型。我刚开始接触这个的时候,也觉得不就是个小孔成像嘛,有啥好讲的?但真正上手做重建才发现,里面的门道可不少。

2.1 针孔模型:最朴素的成像原理

想象一个密闭的盒子,前面戳一个小孔。外面的光线穿过小孔,在盒子后面的感光平面上形成一个倒立的像。这就是针孔模型的核心思想。

数学上,我们把三维空间中的点 \( P(X, Y, Z) \) 映射到图像平面上的点 \( p(u, v) \)。这个映射关系,用齐次坐标写出来就是:

s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T

嗯,这个公式看着有点吓人。别急,我们拆开来看。

其中,s 是一个尺度因子,K 是内参矩阵,[R | t] 是外参矩阵。整个公式的意思就是:世界坐标系下的一个点,先经过旋转和平移(外参),再经过投影缩放(内参),最后变成图像上的像素坐标。

核心要点: 针孔模型假设光线是直线传播的,没有透镜畸变。但现实中的相机都有透镜,所以我们需要在模型基础上加入畸变校正。

2.2 内参矩阵:相机的“内部秘密”

内参矩阵 K 描述了相机本身的属性。它长这样:

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

这里:

  • fxfy:分别是 x 和 y 方向上的焦距(以像素为单位)。
  • cxcy:是主点坐标,也就是光轴与图像平面的交点。

我个人习惯把内参理解为“相机自己的尺子”。它决定了三维空间中的一个角度,在图像上对应多少个像素。比如,你用两个不同的相机拍同一个物体,内参不同,拍出来的物体大小和位置就会有差异。

我的经验: 我在项目中遇到过一台深度相机,标定出来的 cx、cy 明显偏离图像中心。一开始我以为是标定出错了,后来查了 datasheet 才发现,那款相机的 sensor 本身就是偏置安装的。所以,不要想当然地认为主点就在图像正中心。

2.3 外参矩阵:相机在哪儿?朝哪儿看?

外参矩阵 [R | t] 描述了相机在世界坐标系中的位置和朝向。

  • R:3x3 的旋转矩阵,表示相机的朝向。
  • t:3x1 的平移向量,表示相机的位置。

你想想看,同一个物体,你从正面拍和从侧面拍,得到的图像完全不同。这个“不同”就是由外参决定的。在三维重建中,我们经常需要把多个视角的点云融合到一起,这时候就必须知道每个视角的外参,才能把它们对齐到同一个世界坐标系下。

注意: 外参矩阵中的旋转矩阵 R 必须是正交矩阵,且行列式为 +1。我曾经在写代码时不小心传了一个非正交的矩阵进去,结果重建出来的模型扭曲得不成样子。排查了半天才发现是这里的问题。

2.4 畸变模型:现实总是不完美的

针孔模型是理想情况。现实中的相机镜头,尤其是广角镜头,会引入畸变。主要有两种:

径向畸变

这是最常见的畸变。光线经过透镜边缘时,弯曲程度比中心大,导致图像边缘的直线变弯。分为:

  • 桶形畸变:图像边缘向外凸出,像木桶一样。
  • 枕形畸变:图像边缘向内凹陷,像枕头一样。

数学上,我们用多项式来建模:

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^2k1k2k3 是径向畸变系数。

切向畸变

这是由于镜头和 sensor 平面不平行造成的。说白了,就是镜头装歪了。模型如下:

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]

其中,p1p2 是切向畸变系数。

避坑指南: 我曾经用 OpenCV 做标定,发现重投影误差总是降不下去。后来检查发现,我用的标定板是打印在普通 A4 纸上的,纸有点皱,导致角点检测不准。换成贴在玻璃板上的标定板后,误差立刻降下来了。所以,标定板的平整度非常关键。

2.5 知识体系总览

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

相机标定知识体系 世界坐标系 三维点 (X, Y, Z) 外参 [R|t] 相机坐标系 (Xc, Yc, Zc) 投影 归一化平面 (x, y) 内参 K 像素坐标系 (u, v) 畸变模型 径向畸变 (k1, k2, k3) 切向畸变 (p1, p2) 畸变校正 图例: 输入 中间变换 中间结果 输出 校正模块

从这张图可以看得很清楚:世界坐标经过外参变换到相机坐标,再投影到归一化平面,最后通过内参映射到像素坐标。而畸变模型,则是在归一化平面到像素坐标这一步之间插入的校正环节。

2.6 小结

相机标定的本质,就是求解内参、外参和畸变系数。有了这些参数,我们才能把二维图像中的像素点,反投影回三维空间,或者把三维点投影到图像上。这是所有三维重建算法的基础。

嗯,这一节的内容就到这里。记住,标定做不好,重建全白搞。下一节我们会讲具体的标定方法和工具,到时候再细聊。


专注资料整理