第二章:图像传感器基础——CCD与CMOS传感器原理、分辨率与帧率、色彩滤镜阵列(Bayer格式)
好,咱们进入正题。图像传感器,说白了就是嵌入式视觉系统的「眼睛」。你选错了传感器,后面算法再牛也白搭。我这些年做项目,见过太多人上来就调算法,结果发现图像质量根本不行——嗯,那真是欲哭无泪。
2.1 CCD与CMOS传感器:两种主流方案
先说说这两兄弟。CCD和CMOS,本质都是把光信号转成电信号。但实现方式完全不同。
2.1.1 CCD传感器
CCD的全称是电荷耦合器件。它的工作方式有点像「接力赛」——每个像素收集到的电荷,要一个接一个地传递到输出端,统一放大。
- 优点:噪声低,动态范围大,图像均匀性好。我早期做工业检测时,用的就是CCD相机,拍出来的暗部细节确实干净。
- 缺点:功耗高,读出速度慢,成本高。而且它需要多路高压时钟驱动,电路设计比较麻烦。
- 典型应用:天文摄影、医疗影像、高端工业检测。
2.1.2 CMOS传感器
CMOS就灵活多了。每个像素自带放大器,可以独立读出。说白了就是「各自为政」。
- 优点:功耗低,速度快,集成度高。现在手机里的摄像头全是CMOS。
- 缺点:固定模式噪声(FPN)比较明显,早期CMOS的暗电流也大。
- 典型应用:手机摄像头、安防监控、车载视觉、嵌入式AI。
为什么会这样?因为CMOS每个像素的放大器参数不可能完全一致,导致画面出现固定的条纹或斑点。不过现在的工艺已经好很多了,再加上数字校正,基本看不出来。
2.2 分辨率与帧率:鱼和熊掌
这两个参数,你肯定天天打交道。但很多人只盯着分辨率,忽略了帧率。
2.2.1 分辨率
分辨率就是像素数量。常见的:640×480(VGA)、1280×720(HD)、1920×1080(FHD)、2592×1944(5MP)。
但注意:分辨率越高,数据量越大。我见过有人用2000万像素的传感器做实时识别,结果处理器根本来不及处理——帧率掉到个位数。
| 分辨率 | 像素数 | 典型应用 |
|---|---|---|
| 640×480 | 0.3MP | 低成本嵌入式、简单检测 |
| 1280×720 | 0.9MP | 安防、人脸识别 |
| 1920×1080 | 2.1MP | 主流视觉、车牌识别 |
| 2592×1944 | 5MP | 精细检测、文档扫描 |
2.2.2 帧率
帧率就是每秒多少帧(fps)。人眼大概能分辨24fps,但机器视觉不一样。
- 30fps:常规监控、交互式应用
- 60fps:运动检测、高速场景
- 120fps以上:工业流水线、高速抓拍
这里有个关键公式:数据带宽 = 分辨率 × 帧率 × 像素位深。举个例子:1080p@30fps,RGB888格式,带宽就是 1920×1080×30×24 ≈ 1.5Gbps。你的处理器接口能扛住吗?
2.3 色彩滤镜阵列:Bayer格式
好了,现在传感器能感知光了,但怎么得到彩色图像?
单个像素只能感知亮度,分不清颜色。所以我们在像素表面盖一层彩色滤镜——这就是色彩滤镜阵列(CFA)。最常见的,就是Bayer格式。
2.3.1 Bayer格式的原理
Bayer阵列的排列是:RGGB。也就是每2×2的像素块里,有1个红色、2个绿色、1个蓝色。
为什么绿色多一个?因为人眼对绿色最敏感。你想想看,自然界里绿色信息最多,所以多采样绿色,能提升视觉质量。
// 典型的Bayer排列(RGGB)
R G R G R G
G B G B G B
R G R G R G
G B G B G B
每个像素只记录一种颜色。那其他颜色怎么办?靠插值(demosaicing)算出来。
2.3.2 去马赛克(Demosaicing)
从Bayer原始数据到完整RGB图像,这一步叫去马赛克。常见算法有:
- 最近邻插值:最快,但锯齿严重。适合预览。
- 双线性插值:平衡速度和画质。我早期项目常用。
- 自适应插值:根据边缘方向调整,画质好但计算量大。
2.3.3 其他CFA格式
除了Bayer,还有几种:
- X-Trans:富士的专利,6×6排列,减少摩尔纹。
- RGBW:加入白色像素,提升低光照灵敏度。
- RCCC:用于自动驾驶,红色+三个透明通道,提升信噪比。
但说实话,90%的嵌入式视觉项目,Bayer格式就够了。别折腾那些冷门格式,除非你有特殊需求。
2.4 小结
这一章内容不少,我帮你捋一下重点:
- CCD vs CMOS:CCD画质好但慢,CMOS灵活但噪点多。嵌入式视觉首选CMOS。
- 分辨率与帧率:别只看分辨率,要算带宽。帧率不够,一切白搭。
- Bayer格式:最主流的CFA,去马赛克算法要选对,别在嵌入式上跑太复杂的。
下一章,咱们聊聊镜头和光学系统。嗯,那又是另一个坑了——不过别担心,我会把踩过的坑都告诉你。