2. 成像模型
各位同学,欢迎来到第二章。
上一章我们聊了为什么要做标定。这一章,我们来啃一块硬骨头——成像模型。
说白了,就是搞明白一件事:现实世界中的一个点,是怎么跑到相机照片里那个像素位置上的?
这个映射关系,是所有标定算法的根基。你如果把这个模型吃透了,后面那些矩阵公式,看起来就跟搭积木一样简单。
2.1 针孔相机模型:最朴素的成像原理
我们先从最简单的说起——针孔相机模型。
你想想看,最早的相机长什么样?就是一个黑盒子,前面戳一个小孔,后面放一张胶片。光线穿过小孔,在胶片上形成一个倒立的像。
这就是针孔模型的核心思想:小孔成像。
核心公式(理想情况):
假设空间点 P(X, Y, Z) 在相机坐标系下,投影到成像平面上的点 p(x, y)。
根据相似三角形:
x = f * (X / Z)
y = f * (Y / Z)
其中 f 是焦距(小孔到成像平面的距离)。
这个公式看着简单,但它是整个视觉几何的基石。我在项目中遇到过不少新手,一上来就套复杂的畸变模型,结果发现连最基本的投影关系都没搞对。嗯,这里要注意,先搞懂理想模型,再谈畸变。
我的习惯: 每次拿到一个新相机,我都会先用这个理想模型算一遍理论投影位置,再跟实际图像对比。这样能快速判断出畸变的严重程度。
2.2 四大坐标系:从世界到像素的“四步走”
现实中的成像,比针孔模型要复杂一点。因为一个点要经过四次坐标变换,才能最终变成像素。
我习惯把这四次变换叫做“四步走”。每一步都有明确的物理意义。
下面这张图,把这四个坐标系和它们之间的变换关系画清楚了。
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 本章小结
这一章我们搞清楚了成像模型的骨架:
- 针孔模型是基础,相似三角形是核心。
- 四大坐标系各有分工,通过外参、内参、畸变系数串联起来。
- 变换顺序不能乱:世界→相机→图像→(畸变)→像素。