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 的工作原理,我简单描述一下:
- 每个像素是一个光电二极管,光子撞击产生电子
- 电子被存储在像素的势阱里
- 曝光结束后,电荷逐行转移到读出寄存器
- 读出寄存器把电荷串行送到放大器,转成电压
- ADC 把电压量化为数字值
CMOS 则不同:每个像素自带一个放大器,可以直接读出电压。所以 CMOS 可以做到局部读出——我只读感兴趣的区域,速度飞快。
我个人的选择建议:做静态高精度测量(比如尺寸检测),我倾向用CCD,噪声低、图像干净。做高速运动检测(比如流水线上的产品),CMOS更合适,帧率高、延迟小。
1.4 从光到数字——完整的成像链路
把上面三部分串起来,就是完整的成像过程:
- 场景光照:光源照射物体,反射光进入镜头
- 透镜聚光:透镜把光线汇聚到传感器平面
- 畸变发生:透镜曲率导致光线偏折,产生畸变
- 光电转换:传感器像素吸收光子,产生电子
- 电荷读出:CCD逐行转移或CMOS逐像素读出
- 模数转换:模拟电压被ADC量化为数字灰度值
- 图像输出:数字图像通过接口(USB、GigE、Camera Link)传给计算机
这里面每一步都会引入误差。标定的目的,就是把这些误差建模出来,然后反向补偿。
一句话总结:相机成像 = 小孔几何模型 + 透镜畸变模型 + 传感器采样模型。标定就是求这三个模型的参数。
1.5 本章小结
这一章咱们把相机成像的底层原理捋了一遍。记住三个核心:
- 小孔模型是理想化的几何基础,标定就是求它的内参矩阵
- 透镜畸变是现实中的非线性误差,用多项式模型补偿
- 传感器是光电转换的硬件,CCD和CMOS各有优劣