第二章 图像采集基础:CMOS传感器与同步信号解析

各位同学,今天我们来聊聊图像采集的底层逻辑。说实话,很多做FPGA图像处理的工程师,上来就写代码,结果图像出来全是花屏。为什么?因为没搞懂传感器怎么工作的。我当年也踩过这个坑,后来花了整整一周才把行场同步信号彻底吃透。

2.1 CMOS传感器工作原理

CMOS传感器,说白了就是一个光电转换器。每个像素点就是一个感光二极管,光线照上去产生电荷,电荷量跟光强成正比。然后通过行列寻址,把每个像素的电压值读出来。

我个人习惯把CMOS传感器的工作流程分成三步:

  1. 曝光:感光二极管积累电荷,曝光时间越长,电荷越多
  2. 读出:通过行选通和列选通,逐行读出像素电压
  3. 量化: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传感器工作原理 • 光电转换:光子→电荷→电压 • 滚动快门 vs 全局快门 • 帧率计算:PCLK/(H×V) • 曝光时间控制 • ADC量化精度 色彩滤波阵列(CFA) • Bayer格式:RGGB/GBRG • 绿色像素占50%原因 • 去马赛克算法 • 颜色插值方法 • 偏色校正技巧 行场同步信号 • HSYNC:行同步,一行开始 • VSYNC:场同步,一帧开始 • 消隐区:HBlank/VBlank • 极性配置:高/低电平有效 • 时序对齐:建立/保持时间 PCLK与像素时钟 • PCLK:像素输出时钟 • 频率计算:考虑消隐区 • PLL倍频/分频技巧 • 时钟抖动与噪声 • 跨时钟域处理 理解底层原理,才能写出稳定的FPGA代码

这张图把四个核心模块串起来了。CMOS传感器输出Bayer格式的像素数据,通过PCLK时钟同步传输,HSYNC和VSYNC告诉我们什么时候开始、什么时候结束。FPGA要做的,就是按照这个节奏,把数据稳稳地接住。

好了,这一章的内容就到这里。记住一句话:图像采集的根基,就是搞懂传感器怎么输出数据,FPGA怎么接收数据。后面章节我们会一步步深入,把这些原理变成可运行的代码。

可可精品资料库