第1章:相机成像原理——从三维世界到二维像素的“魔法”
大家好,我是你们的老朋友。今天咱们聊聊三维重建里最基础、也最绕不开的一个话题——相机成像原理。
说白了,相机就是个“翻译官”。它把真实世界里的三维点,翻译成图像上的二维像素。你想想看,我们人眼能感知深度,但相机不行。它只能记录光线强度。那怎么从一张张平面照片里,还原出三维结构呢?
嗯,这就要从针孔相机模型说起了。
1.1 针孔相机模型:最朴素的成像方式
针孔相机模型,是所有相机模型的“老祖宗”。它假设光线通过一个小孔,在后面的成像平面上形成倒立的像。虽然现代相机都用透镜,但数学上,我们依然用针孔模型来近似。
我个人习惯把针孔模型想象成一个“暗箱”。前面有个小孔,后面是感光元件。光线穿过小孔,在感光元件上投影。这个模型简单到令人发指,但足够描述绝大多数成像过程。
核心公式:
假设三维空间点 P = [X, Y, Z]^T,投影到成像平面上的点 p = [x, y]^T。根据相似三角形:
x = f * X / Z
y = f * Y / Z
其中 f 是焦距(小孔到成像平面的距离)。
这里有个坑,我刚开始学的时候经常搞混。注意,这里的 Z 是物体到相机的深度,不是随便一个坐标。而且,成像平面上的像是倒立的。但实际应用中,我们通常把成像平面“虚拟”到小孔前面,这样像就是正立的,公式也变成 x = f * X / Z。嗯,数学上方便很多。
1.2 坐标系转换:四个坐标系,一次旅行
一个三维点要变成像素,得经历四次坐标系变换。我管它叫“点云的四次旅行”。
- 世界坐标系:你站在哪里看世界?这是绝对坐标系,描述物体在真实世界中的位置。
- 相机坐标系:相机在哪儿?以相机光心为原点,Z轴指向镜头前方。
- 图像坐标系:成像平面上的物理位置。单位是毫米或米。
- 像素坐标系:最终图像上的行列号。单位是像素。
为什么会这么麻烦?因为每个坐标系都有自己的“语言”。世界坐标系说“米”,像素坐标系说“像素”。你得一步步翻译过去。
我记得有一次做项目,标定板上的点明明在世界坐标系里是规则的格子,但投影到图像上却歪了。后来发现是坐标系转换时,旋转矩阵写反了。嗯,这种错误很隐蔽,但后果很严重。
1.2.1 世界坐标系 → 相机坐标系(外参矩阵)
这一步是刚体变换。说白了,就是把世界坐标系下的点,旋转平移一下,放到相机坐标系里。
P_cam = R * P_world + t
其中 R 是 3x3 旋转矩阵,t 是 3x1 平移向量。R 和 t 合起来,就是 外参矩阵。外参描述的是相机在世界坐标系中的位姿。
避坑指南: 我曾经在写代码时,把 R 和 t 的顺序搞反了。先平移后旋转,结果点云全飞了。记住,一定是先旋转,再平移。或者用齐次坐标,写成 [R | t] 的形式。
1.2.2 相机坐标系 → 图像坐标系(内参矩阵的一部分)
这一步就是针孔投影。把三维点投影到成像平面上。
x = f * X_cam / Z_cam
y = f * Y_cam / Z_cam
注意,这里得到的是物理坐标(比如毫米)。但图像传感器上的像素是离散的,所以还得再转一次。
1.2.3 图像坐标系 → 像素坐标系(内参矩阵的另一部分)
这一步是离散化。把物理坐标映射到像素坐标。
u = x / dx + u0
v = y / dy + v0
其中 dx, dy 是每个像素的物理尺寸(毫米/像素),u0, v0 是图像中心(主点)的像素坐标。
把上面两步合并,就得到了 内参矩阵 K:
K = [fx, 0, u0;
0, fy, v0;
0, 0, 1]
其中 fx = f / dx, fy = f / dy。fx, fy 就是焦距在像素单位下的表达。
1.3 内参与外参矩阵:相机的“身份证”和“定位器”
内参矩阵 K 是相机的“身份证”。它描述了相机本身的属性:焦距、像素大小、主点位置。每台相机都不一样,需要标定才能得到。
外参矩阵 [R | t] 是相机的“定位器”。它告诉你相机在哪儿、朝哪儿看。同一个相机,换个位置,外参就变了。
把内外参合起来,就是完整的投影方程:
s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T
其中 s 是尺度因子(其实就是 Z_cam)。
重要提醒: 这个方程是齐次坐标下的。左边是 3x1 向量,右边是 3x4 矩阵乘以 4x1 向量。很多初学者会忽略 s,导致投影结果不对。记住,s 不是 1,除非你归一化了。
1.4 一个完整的例子
假设世界坐标系下有一个点 P = [1, 2, 10]^T(单位米)。相机外参是:
R = I (单位矩阵)
t = [0, 0, 0]^T (相机在世界原点)
内参是:
fx = 500, fy = 500, u0 = 320, v0 = 240
那么投影到像素坐标:
- 相机坐标:P_cam = [1, 2, 10]
- 图像坐标:x = 500 * 1 / 10 = 50, y = 500 * 2 / 10 = 100
- 像素坐标:u = 50 + 320 = 370, v = 100 + 240 = 340
所以,点 P 在图像上的像素位置是 (370, 340)。
你想想看,如果相机旋转了 90 度,或者焦距变了,这个点会跑到哪里去?嗯,这就是内外参的作用。
1.5 总结与个人经验
相机成像原理,说白了就是“三维到二维的映射”。内参是相机自己的“脾气”,外参是相机在空间里的“位置”。
我个人建议,初学者一定要亲手推导一遍投影公式。不要只看书。拿张纸,画个针孔模型,标出坐标系,一步步算。我当年就是这么过来的。
另外,实际项目中,内参通常用张正友标定法得到。外参则可以通过 PnP 算法求解。这些我们后面章节会详细讲。
嗯,今天就到这儿。下一章,咱们聊聊相机标定的具体操作——怎么用棋盘格照片,算出你的相机内参。
关键点回顾:
- 针孔模型:x = f * X / Z, y = f * Y / Z
- 四次坐标系变换:世界→相机→图像→像素
- 内参 K:焦距、主点、像素尺寸
- 外参 [R|t]:旋转和平移
- 完整投影方程:s * [u, v, 1]^T = K * [R|t] * [X, Y, Z, 1]^T
公众号:蓝海资料掘金营,微信deep3321