1. 相机成像原理

做机器视觉这些年,我接触过各种各样的相机。从几十块钱的USB摄像头到几十万的高端工业相机,说到底,它们成像的基本原理都是一样的。今天咱们就把这个底层的成像逻辑彻底聊透。

你想想看,相机是怎么把三维世界“塞”进一张二维图片里的?这背后有三个关键环节:小孔成像模型决定了最基本的几何关系,透镜畸变告诉我们为什么实际图像会变形,而数字图像传感器则是把光信号变成电信号的硬件核心。

核心理解:相机标定的本质,就是反推小孔模型的参数,同时补偿透镜畸变。不懂成像原理,标定就是瞎调参数。

1.1 小孔成像模型——最朴素的相机

小孔成像的原理其实特别简单。光线从物体表面反射出来,穿过一个小孔,在后面的平面上形成倒立的像。我记得第一次在暗室里做这个实验,看到蜡烛火焰倒着出现在纸屏上,那种感觉还挺奇妙的。

数学上,小孔模型用相似三角形来描述。假设物体高度为 \(H\),距离小孔为 \(D\),像高为 \(h\),像距(小孔到成像面)为 \(f\),那么:

H / D = h / f

这个 \(f\) 就是咱们常说的焦距。不过在实际相机里,焦距不是物理小孔到传感器的距离,而是透镜的光学中心到传感器的距离。

小孔模型有几个理想化假设:

  • 光线直线传播,没有弯曲
  • 小孔无限小(实际上不可能,太小了进光量不够)
  • 成像面是完美的平面

但现实中没有这么完美的事。小孔太小,图像就暗;小孔太大,图像就模糊。所以工业相机必须用透镜来聚光,这就引出了下一个问题——畸变。

我的经验:在做高精度测量项目时,我习惯先用小孔模型做初始标定,再引入畸变校正。这样参数收敛快,不容易陷入局部最优。

1.2 透镜畸变——为什么直线会变弯

透镜虽然解决了进光量的问题,但它带来了新的麻烦——畸变。说白了,就是透镜的曲面让光线发生了非线性的偏折。

畸变主要分两种:

畸变类型 表现 产生原因 典型场景
径向畸变 直线变弯,像鱼眼效果 透镜曲率不均匀,边缘折射率与中心不同 广角镜头、手机摄像头
切向畸变 图像倾斜、梯形变形 透镜与成像面不平行(装配误差) 工业相机安装偏差

径向畸变又分两种:

  • 桶形畸变:图像中心向外膨胀,边缘向内收缩。广角镜头常见。
  • 枕形畸变:图像中心向内收缩,边缘向外膨胀。长焦镜头常见。

数学上,我们用多项式来建模畸变。对于归一化坐标 \((x, y)\),畸变后的坐标 \((x_d, y_d)\) 为:

r² = x² + y²
x_d = x * (1 + k₁*r² + k₂*r⁴ + k₃*r⁶) + [2*p₁*x*y + p₂*(r² + 2*x²)]
y_d = y * (1 + k₁*r² + k₂*r⁴ + k₃*r⁶) + [p₁*(r² + 2*y²) + 2*p₂*x*y]

其中 \(k₁, k₂, k₃\) 是径向畸变系数,\(p₁, p₂\) 是切向畸变系数。标定的任务就是求出这5个参数。

我曾经踩过的坑:有一次做PCB板检测,发现边缘的焊盘位置总是偏。查了半天,原来是镜头畸变没校正好。我用的标定板太小,只覆盖了画面中心区域,边缘畸变参数根本没算准。后来换了覆盖全视场的大标定板,问题就解决了。

1.3 数字图像传感器——CCD与CMOS的工作原理

光线穿过透镜,打到传感器上。传感器把光信号转成电信号,再量化成数字值。目前主流的就是两种:CCD 和 CMOS。

它们的核心区别在于读出方式:

特性 CCD CMOS
读出方式 电荷逐行转移,统一输出 每个像素独立放大、读出
噪声水平 低(统一放大) 较高(每个像素放大器不一致)
功耗 高(需要多组电压) 低(单电压供电)
读出速度 较慢(串行读出) 快(并行读出)
成本 高 低
工业应用 高精度、低噪声场景 高速、低成本场景

CCD 的工作原理,我简单描述一下:

  1. 每个像素是一个光电二极管,光子撞击产生电子
  2. 电子被存储在像素的势阱里
  3. 曝光结束后,电荷逐行转移到读出寄存器
  4. 读出寄存器把电荷串行送到放大器,转成电压
  5. ADC 把电压量化为数字值

CMOS 则不同:每个像素自带一个放大器,可以直接读出电压。所以 CMOS 可以做到局部读出——我只读感兴趣的区域,速度飞快。

我个人的选择建议:做静态高精度测量(比如尺寸检测),我倾向用CCD,噪声低、图像干净。做高速运动检测(比如流水线上的产品),CMOS更合适,帧率高、延迟小。

1.4 从光到数字——完整的成像链路

把上面三部分串起来,就是完整的成像过程:

  1. 场景光照:光源照射物体,反射光进入镜头
  2. 透镜聚光:透镜把光线汇聚到传感器平面
  3. 畸变发生:透镜曲率导致光线偏折,产生畸变
  4. 光电转换:传感器像素吸收光子,产生电子
  5. 电荷读出:CCD逐行转移或CMOS逐像素读出
  6. 模数转换:模拟电压被ADC量化为数字灰度值
  7. 图像输出:数字图像通过接口(USB、GigE、Camera Link)传给计算机

这里面每一步都会引入误差。标定的目的,就是把这些误差建模出来,然后反向补偿。

一句话总结:相机成像 = 小孔几何模型 + 透镜畸变模型 + 传感器采样模型。标定就是求这三个模型的参数。

相机成像完整链路 场景光照 物体反射光线 透镜聚光 产生畸变 光电转换 光子→电子 电荷读出 CCD/CMOS 模数转换 模拟→数字 小孔成像模型 焦距 f、主点 (cx, cy) 相似三角形几何关系 透镜畸变模型 径向 k₁,k₂,k₃ 切向 p₁,p₂ 传感器采样模型 像素尺寸、量子效率 读出噪声、ADC量化 标定的本质:求这三个模型的参数,然后反向补偿 小孔参数 + 畸变参数 + 传感器参数 → 校正后的理想图像 标定输出:内参矩阵 + 畸变系数

1.5 本章小结

这一章咱们把相机成像的底层原理捋了一遍。记住三个核心:

  • 小孔模型是理想化的几何基础,标定就是求它的内参矩阵
  • 透镜畸变是现实中的非线性误差,用多项式模型补偿
  • 传感器是光电转换的硬件,CCD和CMOS各有优劣