第二章:图像传感器基础——CCD与CMOS传感器原理、分辨率与帧率、色彩滤镜阵列(Bayer格式)

好,咱们进入正题。图像传感器,说白了就是嵌入式视觉系统的「眼睛」。你选错了传感器,后面算法再牛也白搭。我这些年做项目,见过太多人上来就调算法,结果发现图像质量根本不行——嗯,那真是欲哭无泪。

2.1 CCD与CMOS传感器:两种主流方案

先说说这两兄弟。CCD和CMOS,本质都是把光信号转成电信号。但实现方式完全不同。

2.1.1 CCD传感器

CCD的全称是电荷耦合器件。它的工作方式有点像「接力赛」——每个像素收集到的电荷,要一个接一个地传递到输出端,统一放大。

  • 优点:噪声低,动态范围大,图像均匀性好。我早期做工业检测时,用的就是CCD相机,拍出来的暗部细节确实干净。
  • 缺点:功耗高,读出速度慢,成本高。而且它需要多路高压时钟驱动,电路设计比较麻烦。
  • 典型应用:天文摄影、医疗影像、高端工业检测。
我的经验:如果你做的是静态场景、对画质要求极高、不差钱的项目,CCD依然是首选。但别指望它跑30fps以上的视频流——我试过,发热量会让你怀疑人生。

2.1.2 CMOS传感器

CMOS就灵活多了。每个像素自带放大器,可以独立读出。说白了就是「各自为政」。

  • 优点:功耗低,速度快,集成度高。现在手机里的摄像头全是CMOS。
  • 缺点:固定模式噪声(FPN)比较明显,早期CMOS的暗电流也大。
  • 典型应用:手机摄像头、安防监控、车载视觉、嵌入式AI。

为什么会这样?因为CMOS每个像素的放大器参数不可能完全一致,导致画面出现固定的条纹或斑点。不过现在的工艺已经好很多了,再加上数字校正,基本看不出来。

避坑指南:我曾经在一个低光照项目中用了某款廉价CMOS,结果暗部全是噪点。后来换了背照式(BSI)CMOS,效果立竿见影。记住: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。你的处理器接口能扛住吗?

核心建议:做嵌入式视觉,别盲目追求高分辨率。我个人的习惯是:先确定帧率需求,再反推分辨率。比如做运动检测,60fps比4K分辨率重要得多。

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图像,这一步叫去马赛克。常见算法有:

  • 最近邻插值:最快,但锯齿严重。适合预览。
  • 双线性插值:平衡速度和画质。我早期项目常用。
  • 自适应插值:根据边缘方向调整,画质好但计算量大。
我的经验:在嵌入式平台上,别用太复杂的去马赛克算法。我曾经在STM32上跑自适应插值,结果一帧要处理200ms——直接放弃。后来换成双线性,帧率上去了,效果也够用。

2.3.3 其他CFA格式

除了Bayer,还有几种:

  • X-Trans:富士的专利,6×6排列,减少摩尔纹。
  • RGBW:加入白色像素,提升低光照灵敏度。
  • RCCC:用于自动驾驶,红色+三个透明通道,提升信噪比。

但说实话,90%的嵌入式视觉项目,Bayer格式就够了。别折腾那些冷门格式,除非你有特殊需求。

避坑指南:我曾经接手一个项目,前任用了RGBW传感器,结果算法库不支持,还得自己写去马赛克。折腾了两周,最后换回Bayer,一天搞定。所以,选传感器时一定要确认你的软件栈是否支持。

2.4 小结

这一章内容不少,我帮你捋一下重点:

  1. CCD vs CMOS:CCD画质好但慢,CMOS灵活但噪点多。嵌入式视觉首选CMOS。
  2. 分辨率与帧率:别只看分辨率,要算带宽。帧率不够,一切白搭。
  3. Bayer格式:最主流的CFA,去马赛克算法要选对,别在嵌入式上跑太复杂的。

下一章,咱们聊聊镜头和光学系统。嗯,那又是另一个坑了——不过别担心,我会把踩过的坑都告诉你。