2、成像模型:针孔相机模型、世界坐标系、相机坐标系、图像坐标系、像素坐标系

各位同学,欢迎来到第二章。

上一章我们聊了为什么要做标定。这一章,我们来啃一块硬骨头——成像模型。

说白了,就是搞明白一件事:现实世界中的一个点,是怎么跑到相机照片里那个像素位置上的?

这个映射关系,是所有标定算法的根基。你如果把这个模型吃透了,后面那些矩阵公式,看起来就跟搭积木一样简单。

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

我们先从最简单的说起——针孔相机模型。

你想想看,最早的相机长什么样?就是一个黑盒子,前面戳一个小孔,后面放一张胶片。光线穿过小孔,在胶片上形成一个倒立的像。

这就是针孔模型的核心思想:小孔成像。

核心公式(理想情况):

假设空间点 P(X, Y, Z) 在相机坐标系下,投影到成像平面上的点 p(x, y)。

根据相似三角形:

x = f * (X / Z)
y = f * (Y / Z)

其中 f 是焦距(小孔到成像平面的距离)。

这个公式看着简单,但它是整个视觉几何的基石。我在项目中遇到过不少新手,一上来就套复杂的畸变模型,结果发现连最基本的投影关系都没搞对。嗯,这里要注意,先搞懂理想模型,再谈畸变。

我的习惯: 每次拿到一个新相机,我都会先用这个理想模型算一遍理论投影位置,再跟实际图像对比。这样能快速判断出畸变的严重程度。

2.2 四大坐标系:从世界到像素的“四步走”

现实中的成像,比针孔模型要复杂一点。因为一个点要经过四次坐标变换,才能最终变成像素。

我习惯把这四次变换叫做“四步走”。每一步都有明确的物理意义。

下面这张图,把这四个坐标系和它们之间的变换关系画清楚了。

四大坐标系与变换关系图 四大坐标系与变换关系 世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 图像坐标系 (x, y) 像素坐标系 (u, v) 刚体变换 (R, t) 外参 透视投影 (f) 内参 仿射变换 (dx, dy, u0, v0) 💡 关键理解: 外参(R, t)决定“相机在哪看”;内参(f, dx, dy, u0, v0)决定“看到的像怎么变成像素”。 ⚠ 畸变校正:在图像坐标系与像素坐标系之间插入 📐 变换流程总结: 1. 世界点 Pw → 相机点 Pc:Pc = R * Pw + t 2. 相机点 Pc → 图像点 p:x = f * Xc/Zc, y = f * Yc/Zc 3. 图像点 p → 像素点 (u,v):u = x/dx + u0, v = y/dy + v0 ⚠ 实际中,步骤2和3之间要插入畸变校正!

2.3 逐个拆解:每个坐标系是干什么的?

我们一个一个来看。

2.3.1 世界坐标系 (World Coordinate System)

  • 符号: (Xw, Yw, Zw)
  • 作用: 描述物体在真实世界中的位置。单位是毫米或米。
  • 特点: 你可以任意定义它的原点。比如放在棋盘格的角点上,或者放在机器人基座上。

我个人习惯把世界坐标系放在标定板的第一个角点上。这样计算出来的外参,直接就是相机相对于标定板的位姿,非常直观。

2.3.2 相机坐标系 (Camera Coordinate System)

  • 符号: (Xc, Yc, Zc)
  • 作用: 以相机光心为原点,Zc轴指向相机前方。
  • 特点: 这是一个三维坐标系。世界坐标系通过旋转矩阵R和平移向量t变换到相机坐标系。

外参矩阵:

[Xc]   [R11 R12 R13 t1] [Xw]
[Yc] = [R21 R22 R23 t2] [Yw]
[Zc]   [R31 R32 R33 t3] [Zw]
[1 ]   [0   0   0   1 ] [1 ]

这个4x4矩阵,就是外参矩阵。它描述了相机在世界中的位置和朝向。

2.3.3 图像坐标系 (Image Coordinate System)

  • 符号: (x, y)
  • 作用: 描述投影点在成像平面上的物理位置。单位是毫米。
  • 特点: 这是一个二维坐标系。原点在相机光轴与成像平面的交点(主点)。

这里有个坑,我踩过。图像坐标系的x轴和y轴,方向跟相机坐标系的Xc和Yc是相反的(因为成像是倒立的)。但在算法实现时,我们通常忽略这个符号,直接用正立模型计算。

2.3.4 像素坐标系 (Pixel Coordinate System)

  • 符号: (u, v)
  • 作用: 描述像素在图像数组中的位置。单位是像素。
  • 特点: 原点在图像左上角。u轴向右,v轴向下。

从图像坐标 (x, y) 到像素坐标 (u, v) 的变换,就是内参矩阵的一部分。

内参矩阵 K:

[u]   [fx  0  u0] [x]
[v] = [0  fy  v0] [y]
[1]   [0   0   1 ] [1]

其中:

  • fx = f / dx,fy = f / dy(dx, dy 是每个像素的物理尺寸)
  • (u0, v0) 是主点的像素坐标

2.4 完整变换流程:一个点是怎么变成像素的?

我们把上面四步串起来,看看一个世界点 Pw 是怎么变成像素点 (u, v) 的。

步骤 变换 输入 输出 参数
1 刚体变换 (Xw, Yw, Zw) (Xc, Yc, Zc) R, t(外参)
2 透视投影 (Xc, Yc, Zc) (x, y) f(焦距)
3 畸变校正 (x, y) (x', y') k1, k2, p1, p2(畸变系数)
4 仿射变换 (x', y') (u, v) fx, fy, u0, v0(内参)

⚠ 我曾经踩过的坑:

很多初学者会把畸变校正放在透视投影之前做,这是错的。正确的顺序是:先投影,再畸变,最后转像素。因为畸变是镜头物理特性引起的,发生在光线到达传感器之前。

2.5 为什么需要这么多坐标系?

你可能会问:搞这么复杂干嘛?直接一个坐标系不就行了?

嗯,这个问题我当年也问过。原因其实很简单:每个坐标系都有自己的“舒适区”。

  • 世界坐标系:方便我们描述物体位置。
  • 相机坐标系:方便我们描述光线投影。
  • 图像坐标系:方便我们描述物理成像。
  • 像素坐标系:方便计算机读取和处理。

说白了,就是解耦。把一个大问题拆成几个小问题,每个小问题用最合适的坐标系去解决。这就是工程思维。

我的建议: 刚开始学的时候,不要死记硬背公式。拿一张纸,画一个点,手动走一遍这四步变换。走通了,你就真的懂了。

2.6 本章小结

这一章我们搞清楚了成像模型的骨架:

  • 针孔模型是基础,相似三角形是核心。
  • 四大坐标系各有分工,通过外参、内参、畸变系数串联起来。
  • 变换顺序不能乱:世界→相机→图像→(畸变)→像素。