2. 相机成像原理:小孔成像模型,针孔相机参数(内参、外参),像素坐标系与图像坐标系

各位同学,咱们今天聊点硬核的——相机到底是怎么看到世界的?

你可能觉得这很简单,不就是镜头一开,画面就有了吗?但做双目立体视觉,不懂成像原理,后面标定、匹配、深度估计全都会踩坑。我当年刚入行时,就因为没搞懂像素坐标系和图像坐标系的区别,标定结果差了十万八千里,折腾了整整一周才找到问题。

好,咱们从头捋一遍。

2.1 小孔成像模型:相机最朴素的“眼睛”

先问一个问题:最早的相机长什么样?

其实就是一个黑盒子,前面戳一个小孔。光线从物体表面反射,穿过小孔,在盒子内部的平面上形成一个倒立的像。这就是小孔成像模型,也是所有相机模型的基础。

你想想看,这个模型虽然简单,但它抓住了成像的本质:三维世界到二维平面的投影。小孔越小,像越清晰,但进光量也越少。嗯,这里要注意,实际相机不可能用这么小的孔,否则拍出来的照片全是黑的。所以现代相机用透镜来替代小孔,既能聚光又能成像。

但数学上,我们依然用小孔模型来近似。为什么?因为简单、线性、好算。

核心公式:

假设物体在三维空间中的坐标为 (X, Y, Z),成像平面距离小孔的距离为 f(焦距),那么像点在成像平面上的坐标为:

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

这就是最基础的投影关系。注意,这里 Z 是物体到相机的深度,也就是我们最终要估计的东西。

我在项目中遇到过一个问题:用这个公式算出来的坐标,和实际图像上的像素位置对不上。后来才发现,我忽略了单位换算——成像平面上的坐标是物理单位(毫米),而图像上的坐标是像素单位。这就引出了下一个话题。

2.2 像素坐标系与图像坐标系:别搞混了

这两个概念,说白了就是“物理世界”和“数字世界”的区别。

图像坐标系:以成像平面的中心为原点,单位是毫米或米。它描述的是光线在物理感光元件上的落点位置。

像素坐标系:以图像的左上角为原点,单位是像素。它描述的是你在电脑上看到的那个像素点的位置。

为什么会这样?因为图像传感器(比如CMOS)是由一个个感光单元排列成的网格。每个感光单元对应一个像素。但传感器的物理中心不一定在像素网格的正中心,而且每个像素的物理尺寸是固定的。

所以,从图像坐标系 (x, y) 到像素坐标系 (u, v) 的转换,需要做两件事:

  1. 缩放:乘以像素的物理尺寸(dx, dy),单位是毫米/像素
  2. 平移:加上主点偏移 (u0, v0),即图像中心在像素坐标系中的位置

我的小技巧:写代码时,我习惯先把所有坐标统一到像素坐标系下处理,最后再换算回物理单位。这样不容易乱。

公式如下:

u = x / dx + u0
v = y / dy + v0

写成矩阵形式,就是咱们后面要讲的内参矩阵的一部分。

2.3 针孔相机参数:内参和外参

好,现在咱们把上面所有的东西打包,就得到了相机的参数。分为两类:

2.3.1 内参:相机自己的“性格”

内参描述的是相机内部的结构,包括:

  • 焦距 f:单位是像素。注意,实际计算时通常用 fx 和 fy 分别表示 x 和 y 方向的焦距,因为像素可能不是正方形。
  • 主点 (u0, v0):光轴与成像平面的交点,在像素坐标系中的位置。
  • 畸变参数:径向畸变(k1, k2, k3)和切向畸变(p1, p2)。透镜不是完美的,会产生畸变,需要校正。

内参矩阵 K 长这样:

K = | fx   0   u0 |
    |  0   fy  v0 |
    |  0    0   1 |

这个矩阵一旦标定好,只要不换镜头、不调焦距,就可以一直用。我建议你把标定好的内参存成一个文件,每次用相机前先加载,省得重复标定。

避坑指南:我曾经在项目里犯过一个低级错误——换了镜头但忘了重新标定内参。结果深度估计的误差直接翻倍。嗯,从那以后我每次换硬件都会重新跑一遍标定流程。

2.3.2 外参:相机在空间中的“位置和姿态”

外参描述的是相机坐标系相对于世界坐标系的旋转和平移。说白了,就是相机放在哪里、朝哪个方向看。

外参包括:

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

世界坐标系中的点 P_w 转换到相机坐标系 P_c 的公式:

P_c = R * P_w + t

在双目立体视觉中,两个相机各自有自己的外参。我们通常以左相机为参考,右相机的外参就是相对于左相机的旋转和平移。这个相对关系叫做“双目外参”,是立体匹配的关键。

2.4 完整成像流程:从世界到像素

把上面所有步骤串起来,一个三维点最终变成像素坐标的流程是:

  1. 世界坐标系 → 相机坐标系:用外参 (R, t) 变换
  2. 相机坐标系 → 图像坐标系:用小孔成像模型投影
  3. 图像坐标系 → 像素坐标系:用内参矩阵转换

写成矩阵形式,就是:

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

其中 s 是尺度因子,因为深度 Z 是未知的。这个公式,就是整个三维视觉的基石。你后面学到的所有东西——标定、匹配、三角测量——都绕不开它。

一句话总结:相机成像,就是把三维世界“压扁”成二维图像的过程。内参告诉你相机怎么“看”,外参告诉你相机在“哪”。

2.5 知识体系结构图

下面我用一张 SVG 图把本章的核心逻辑串起来,方便你记忆:

相机成像原理知识体系 世界坐标系 (X, Y, Z) 外参 (R, t) 旋转 + 平移 相机坐标系 (Xc, Yc, Zc) 外参变换 坐标转换 小孔成像模型 投影:x = f*X/Z 投影变换 图像坐标系 (x, y) 物理单位 成像结果 内参 (K) fx, fy, u0, v0 缩放 + 平移 像素坐标系 (u, v) 像素单位 内参变换 最终像素坐标 输出结果

这张图从左到右、从上到下展示了完整的成像链路。你跟着箭头走一遍,就能理解每个环节的作用。


本章小结:

  • 小孔成像模型是相机成像的数学基础,核心是相似三角形投影
  • 像素坐标系和图像坐标系之间需要缩放和平移转换
  • 内参描述相机内部结构,外参描述相机在空间中的位姿
  • 完整成像流程:世界 → 相机 → 图像 → 像素

好了,这一章的内容就到这里。记住这些概念,后面咱们标定、匹配、算深度的时候,你会感谢今天认真看图的自己。

专注资料整理