第2章:摄像头成像原理——小孔成像、透镜畸变与传感器工作内幕

大家好,我是你们的老朋友。今天咱们来聊聊摄像头到底是怎么「看」到东西的。说实话,我刚开始接触这个领域时,觉得摄像头不就是个镜头加个芯片嘛,有啥好学的?直到第一次做标定,发现图像边缘全是扭曲的,才意识到——嗯,这里面的水,比我想象的深多了。

这一章,我会从最朴素的小孔成像讲起,再到透镜带来的麻烦,最后聊聊CCD和CMOS这两个「幕后英雄」。你想想看,搞懂了这些,后面做标定和检测,心里就有底了。

2.1 小孔成像模型:最朴素的相机

先说个最简单的模型。你拿个黑盒子,前面戳个小孔,后面放张感光纸。光线穿过小孔,在纸上投下一个倒立的像。这就是小孔成像。

数学上怎么描述?其实就一个相似三角形的关系:

物体高度 / 物体到小孔的距离 = 像高度 / 像到小孔的距离

写成公式就是:

y' = - (f * Y) / Z

这里Y是物体高度,Z是物距,f是焦距(小孔到成像面的距离),y'是像高。负号表示像是倒立的。

核心要点:小孔成像模型是理想化的线性模型。它假设光线直线传播,没有畸变。所有相机标定的基础,都是在这个模型上做修正。

我个人习惯,在给学生讲课时,会先让他们用针孔相机拍一张照片。你猜怎么着?照片虽然暗,但边缘绝对笔直。这就是「无畸变」的理想状态。可惜,现实中没有这么完美的事。

2.2 透镜畸变:为什么直线会变弯?

小孔成像虽然简单,但有个致命缺点——进光量太少。为了在暗光下也能拍清楚,我们得用透镜来聚光。透镜一上场,麻烦就来了。

透镜不是完美的球面,光线经过时会发生不同程度的偏折。这就导致了畸变。我在项目中遇到过最头疼的情况,就是标定板上的棋盘格,到了图像边缘全变成了弧形。

畸变主要分两类:

  • 径向畸变:光线在透镜边缘弯曲得更厉害。表现为「桶形畸变」(中间鼓起来)或「枕形畸变」(中间凹下去)。
  • 切向畸变:透镜和成像面不平行,导致图像像被「拧」了一下。

数学上,我们用多项式来修正畸变:

x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + [p1*(r^2 + 2*y^2) + 2*p2*x*y]

其中k1、k2、k3是径向畸变系数,p1、p2是切向畸变系数。r是像素点到图像中心的距离。

避坑指南:我曾经在标定一个广角镜头时,只用了k1和k2两个参数,结果边缘还是歪的。后来加了k3,效果才正常。记住:广角镜头一定要用3个径向畸变参数。

说白了,标定的核心工作之一,就是算出这5个畸变系数(k1,k2,k3,p1,p2)。有了它们,我们就能把弯曲的图像「掰直」。

2.3 数字图像传感器:CCD vs CMOS

光线穿过透镜,最终落在传感器上。传感器把光信号转成电信号,再变成数字图像。目前主流就两种:CCD和CMOS。

特性 CCD CMOS
工作原理 电荷逐行转移,统一输出 每个像素独立转换,并行读出
噪声水平 低(适合弱光) 较高(但现代工艺已改善)
功耗 高(需要多组电压) 低(单电压供电)
读出速度 慢(串行读出) 快(并行读出)
成本
典型应用 工业相机、天文摄影 手机、安防、车载

我个人的经验是:做高精度标定,比如三维重建,尽量用CCD相机。它的噪声低,标定结果更稳定。但如果是做实时目标检测,比如自动驾驶,那就得上CMOS——速度快,功耗低,帧率能跑到60fps以上。

你可能会问:「CMOS噪声高,会不会影响检测精度?」嗯,这个问题问得好。现代CMOS通过背照式(BSI)和堆叠式结构,已经把噪声压得很低了。再加上算法层面的降噪,实际效果已经非常接近CCD。

2.4 从光到数字:传感器的工作流程

不管CCD还是CMOS,基本流程是一样的:

  1. 光电转换:每个像素上的光电二极管,把光子转换成电子。光子越多,积累的电荷越多。
  2. 电荷读出:CCD是逐行转移电荷,最后统一放大输出。CMOS是每个像素自带放大器,直接读出电压值。
  3. 模数转换(ADC):把模拟电压转成数字值。比如8位ADC,输出0-255;10位ADC,输出0-1023。
  4. 图像处理:包括去噪、白平衡、色彩插值(拜耳阵列转RGB)等。

小技巧:标定时,记得关闭相机自带的自动增益(AGC)和自动白平衡(AWB)。否则图像亮度、颜色会变来变去,标定参数就不准了。我吃过这个亏,标定完发现内参每次都不一样,折腾了两天才找到原因。

2.5 像素与分辨率:你看到的不是全部

传感器上每个像素对应图像中的一个点。但注意,像素不是无限小的。每个像素有物理尺寸,比如2.2微米、1.4微米。像素越小,分辨率越高,但进光量也越少,噪声会变大。

分辨率公式很简单:

分辨率 = 像素数量 = 传感器宽度 / 像素尺寸

举个例子:一个1/2.3英寸的传感器(宽度约6.2mm),像素尺寸1.4微米,那么水平方向大约有4428个像素,也就是约4K分辨率。

但我要提醒你:分辨率高不等于图像质量好。像素太小,每个像素接到的光子就少,信噪比下降。我见过一些手机标称1亿像素,但暗光下拍出来的照片全是噪点,还不如老款1200万像素的干净。

所以,做目标检测时,别一味追求高分辨率。要根据你的应用场景来选:

  • 白天户外:高分辨率没问题
  • 室内或夜间:适当降低分辨率,或者用大像素传感器

2.6 总结与思考

这一章我们走完了「光线→透镜→传感器→数字图像」的完整链路。说白了,摄像头就是一个把三维世界投影到二维平面的设备。但这个投影过程有畸变、有噪声、有分辨率限制。

搞懂这些,你就能理解:

  • 为什么标定要拍多张不同角度的棋盘格?——为了解算出畸变参数和内参矩阵。
  • 为什么标定板要贴平?——因为切向畸变就是由不平整引起的。
  • 为什么工业相机比手机相机贵那么多?——因为CCD传感器噪声低、像素大、标定结果更稳定。

下一章,我们会正式进入标定环节,手把手教你用OpenCV算出相机的内参和畸变系数。到时候你会发现,今天讲的这些原理,全都会用上。

好,今天就到这儿。有问题欢迎留言讨论。