第二章 图像采集基础:CMOS传感器与同步信号解析
各位同学,今天我们来聊聊图像采集的底层逻辑。说实话,很多做FPGA图像处理的工程师,上来就写代码,结果图像出来全是花屏。为什么?因为没搞懂传感器怎么工作的。我当年也踩过这个坑,后来花了整整一周才把行场同步信号彻底吃透。
2.1 CMOS传感器工作原理
CMOS传感器,说白了就是一个光电转换器。每个像素点就是一个感光二极管,光线照上去产生电荷,电荷量跟光强成正比。然后通过行列寻址,把每个像素的电压值读出来。
我个人习惯把CMOS传感器的工作流程分成三步:
- 曝光:感光二极管积累电荷,曝光时间越长,电荷越多
- 读出:通过行选通和列选通,逐行读出像素电压
- 量化:ADC把模拟电压转成数字信号
这里有个关键点:CMOS是逐行曝光的。什么意思?就是第一行曝光完,开始读第一行,同时第二行还在曝光。这种滚动快门(Rolling Shutter)方式,拍静态物体没问题,但拍运动物体就会出现「果冻效应」。我在做高速工业相机项目时,就因为这个吃了大亏——拍高速旋转的齿轮,图像直接扭曲了。
重要概念:CMOS传感器的帧率 = 像素时钟频率 / (行像素数 × 列像素数 × 每像素时钟数)
举个例子:PCLK=24MHz,分辨率640×480,每像素1个时钟,帧率 = 24M / (640×480) ≈ 78fps
2.2 色彩滤波阵列(CFA)与Bayer格式
CMOS传感器本身只能感知亮度,分不清颜色。那彩色图像怎么来的?答案就是色彩滤波阵列(CFA)。
最常见的CFA就是Bayer格式。它是在每个像素上覆盖一个滤光片,只允许红、绿、蓝其中一种颜色通过。Bayer格式的排列是:
R G R G ...
G B G B ...
R G R G ...
G B G B ...
...
你想想看,为什么绿色像素是红色和蓝色的两倍?因为人眼对绿色最敏感。这个设计很巧妙,用更少的红色和蓝色像素,人眼也察觉不到。
我曾经在项目中遇到一个问题:客户说图像偏绿。排查了半天,发现是Bayer格式的排列方向搞反了。传感器输出的是GBRG,我按RGGB去解,颜色当然不对。嗯,这里要注意,不同厂家的Bayer排列可能不一样,一定要看数据手册。
实战技巧:拿到一块新传感器,先拍一张纯白画面,然后看每个像素的数值。如果R=G=B,说明Bayer排列对了。如果偏色,就换一种排列试试。
2.3 行场同步信号解析
行场同步信号,是FPGA从传感器读取图像数据的「节拍器」。没有它们,你根本不知道哪一行开始、哪一帧结束。
先看行同步信号(HSYNC):
- HSYNC高电平期间,表示正在传输一行数据
- HSYNC低电平期间,是行消隐区(HBlank),不传有效数据
再看场同步信号(VSYNC):
- VSYNC高电平期间,表示正在传输一帧数据
- VSYNC低电平期间,是场消隐区(VBlank),不传有效数据
我刚开始做的时候,以为HSYNC和VSYNC都是高电平有效。结果接上示波器一看,有的传感器是低电平有效。这个坑我踩过,后来养成了习惯:拿到新传感器,第一件事就是看时序图。
避坑指南:我曾经因为VSYNC极性搞反,导致图像上下颠倒。更惨的是,客户验收时才发现。从那以后,我写FPGA代码时都会加一个极性配置寄存器,方便调试时切换。
2.4 PCLK与像素时钟
PCLK(Pixel Clock)是传感器输出的像素时钟。每个PCLK上升沿,传感器输出一个像素的数据。
PCLK的频率决定了数据吞吐量。举个例子:
| 分辨率 | 帧率 | PCLK频率 |
|---|---|---|
| 640×480 | 30fps | 12MHz |
| 1280×720 | 60fps | 74.25MHz |
| 1920×1080 | 30fps | 74.25MHz |
注意,PCLK频率不是简单的 分辨率 × 帧率。因为还有行消隐和场消隐的时间。实际需要的PCLK频率会更高一些。
我个人习惯在FPGA里用PLL对PCLK做倍频或分频。比如传感器输出24MHz的PCLK,我需要48MHz来处理数据,那就用PLL倍频。但要注意,PLL的输入频率范围有限制,别超了。
核心要点:PCLK是FPGA图像采集的「心跳」。所有数据采集、存储、处理的时序,都要以PCLK为基准。如果PCLK抖动太大,图像就会出现条纹噪声。
2.5 知识体系总览
下面这张图,是我自己总结的图像采集知识体系。你把它理解了,后面写代码就顺了。
这张图把四个核心模块串起来了。CMOS传感器输出Bayer格式的像素数据,通过PCLK时钟同步传输,HSYNC和VSYNC告诉我们什么时候开始、什么时候结束。FPGA要做的,就是按照这个节奏,把数据稳稳地接住。
好了,这一章的内容就到这里。记住一句话:图像采集的根基,就是搞懂传感器怎么输出数据,FPGA怎么接收数据。后面章节我们会一步步深入,把这些原理变成可运行的代码。