与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?


引言
Maxim 串行器可连接并控制摄像头 IC , 这类器件包括 MAX9257 (带有半双工 UART/I2C 控制通道)、MAX9259 和 MAX9263 (两款均带有全双工同步控制通道) 。 MAX9263 还支持宽带数字内容保护(HDCP) 。 本应用笔记介绍如何将摄像头的 RGB 或 YUV 输出转换成标准显示器接受的 RGB 数据 。
摄像头输出数据格式
摄像头芯片 , 例如 OmniVision? OV10630 , 可通过串行器连接 。 OV10630 的接口引脚包括:像素时钟、PCLK、行有效、HREF、帧同步、VSYNC 和并行数据位 D[9:0] 。 数据位在时钟的上升沿保持稳定 。
YUV 和原始 RGB 数据格式
CMOS 摄像头传感器包括数百万光敏单元 , 每个单元可响应整个波长的光信号 。 利用滤光膜使特定传感器仅响应红光、绿光或蓝光信号 。 相邻的光敏单元通常以拜耳结构的滤色规律排列 , 绿色滤色片的数量是红色或蓝色滤色片数量的两倍 。 这种方式用于模拟人眼的感光特性 。 从左至右、从上至下读取传感器单元输出 , 原始的 RGB 数据序列为蓝、绿 ... 蓝、绿 (首行末尾) , 绿、红 ... 绿、红(第二行末尾) , 依次类推 , 如图 1 所示 。
图 1. 原始 RGB 数据排列
通过相邻单元内插生成与传感器单元密度相同的 RGB 数据 。 另外 , 利用相邻单元的颜色 , 按照特定的规则可以恢复图像 。 构成每个像素 RGB 数据组的规则之一是:使用同一行的相邻单元 , 再加上下一行(或上一行)的绿色相邻单元 。 内插后的 RGB 数据序列为 ...、红(i-1)、绿(i-1)、蓝(i-1)、红(i)、绿(i)、蓝(i)、红(i+1)、绿(i+1)、蓝(i+1)、... 如图 2 所示 。 每个像素需要一组 RGB 数据 , 驱动彩色显示器并保持摄像头传感器的最高分辨率 。 内插 RGB 数据的亮度分辨率接近于传感器单元的分辨率 , 但色度分辨率较差 。 由于人眼对每个像素的灰度要比对像素的色彩分量更为敏感 , 所以感觉到的分辨率基本与传感器单元分辨率相同 。
图 2. RGB 数据排列
然而 , 这种 RGB 数据的内插算法使得数据速率增至三倍 。 为了降低数据速率 , 尤其是需要图像传输的场合 , 可采用 YUV 彩色空间(将模拟彩色电视信号压缩到模拟黑白电视的频带) 。 在下式中 , 亮度以 Y 表示 , 蓝色和亮度之间的色差以 U 表示 , 红色和亮度之间的色差以 V 表示 ,

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

式中 , 典型的色彩加权为:WR = 0.299 , WB = 0.114 , WG = 1 - WR - WB = 0.587 , 归一化值为 UMAX , VMAX = 0.615 。
对于采用拜耳滤色镜的摄像头传感器 , 相邻像素的 U 或 V 数据大致相同 , 取决于行索引 i 和像素索引 j (如果采用的规则为相邻颜色) 。 利用本指南 , 可根据下式利用 RGB 数据直接生成 YUV 数据 。
【与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?】
与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

为了降低数据速率 , 利用偶数像素索引的 U 数据和奇数像素索引的 V 数据 , 以及偶数和奇数像素索引的 Y 数据 。 压缩后的 YUV 数据按照图 3 所示排列发送 , 即:Y1、U0 和 V1 为像素 1 的数据;Y2、U2 和 V1 为像素 2 的数据等 。
图 3. YUV422 数据排列
422 表示 Y:U:V 的采样比 , 4:x:x 标准为早期彩色 NTSC 标准 , 按照 4:1:1 色度再次采样 , 所以 , 图像的色彩分辨率仅为亮度分辨率的四分之一 。 目前 , 只有处理非压缩信号的高端设备才会采用 4:4:4 彩色再采样 , 亮度和彩色信息的分辨率完全相同 。
串行器输入格式
Maxim 串行器的并行接口设计用于 24 位 RGB 数据 , 特别是 MAX9259 , 具有像素时钟位(PCLK)和 29 个数据位 , 用于 24 位 RGB 以及行同步、场同步和 3 个控制位 。 除并行数据接口外 , 需要把 DRS 和 BWS 引脚设置成高电平或低电平 , 分别选择数据速率和总线宽度 。
Maxim 串行器 / 解串器
MAX9257 和 MAX9258 串行器 / 解串器(SerDes)具有 18 位并行输入 / 输出 , 适用于 YUV 数据传输;MAX9259/MAX9260 芯片组具有 28 位并行输入 / 输出 , 适用于 RGB 数据传输;MAX9263/MAX9264 SerDes 具有 28 位并行输入 / 输出 , 增加了 HDCP 功能 。 此外 , MAX9265 和 MAX9268 28 位 SerDes 带有摄像链路 , 代替并行输入 / 输出接口 。 所有 28 位 Maxim 串行器和解串器具有相同的并 / 串数据映射 , 可互换使用 。 例如 , MAX9259 串行器可配合 MAX9268 解串器使用 , 传输 RGB 数据(借助于 FPGA) 。 数据从 CMOS 摄像头通过串行链路发送至摄像链路接口的显示器 。
串行器映射
为匹配 MAX9268 解串器摄像链路的输出接口 , 并行 RGB 数据应按照以下信号图映射 。 图 4 所示为 MAX9268 并行位与其摄像链路输出之间的映射 , 图 5 所示为相机链路的 RGB 数据映射 。 表 1 所示为 MAX9259 串行器的对应内容映射 。

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

图 4. MAX9268 内部并行至输出映射

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

图 5. 摄像链路内容映射
表 1. MAX9259 串行器 RGB 内容位映射

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

色彩转换:YUV 至 RGB
FPGA 芯片可将压缩(降低数据速率)后的摄像头数据 YUV 转换成 RGB 数据 , 用于 MAX9259 串行器 。 采用 8 位定点运算时 , 色彩空间转换的公式如下 , 式 2 和式 3 中 , Dn 和 En 的 n 为偶数 。
Cn = Yn - 16
Dn = Dn + 1 = Un - 128
En = En + 1 = Vn + 1 - 128
Rn = clip((298 × Cn + 409 × En + 128) >> 8)
Gn = clip((298 × Cn - 100 × Dn - 208 × En + 128) >> 8)
Bn = clip((298 × Cn × 516 × Dn + 128) >> 8)
式中 , >> 8 表示“向右移 8 位” , clip 表示“只取最低 8 位” 。
FPGA 方案
输入缓冲
输入缓冲电路包括计数器、三个寄存器和组合逻辑 , 将单字节时钟输入转换成三字节时钟输出 , 输出时钟速率为输入的一半 。 组合逻辑仅用于分别使能 Y、U 和 V 字节的对应寄存器 。

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

图 6. 输入缓冲电路
时钟开关
FPGA 输出像素时钟速率为摄像头像素时钟的一半 , 用于驱动串行器像素时钟输入 。 但是 , 摄像头在初始化之前不会输出像素时钟 。 解决方案是在 FPGA 内部采用 2:1 时钟复用器(mux)和时钟信号检测器 , mux 由时钟信号检测器控制 。 上电时 , mux 的默认时钟来自摄像头的时钟振荡器 , 使 SerDes 芯片组提供启动摄像头的控制通道 。 时钟信号检测器对场同步信号脉冲进行计数 , 经过几个场同步脉冲后 , mux 切换到摄像头像素时钟速率的一半 。 采用高清摄像头传感器时 , 例如 OV10630 , 每个场同步周期包含 100k 以上的像素时钟 。 几个场同步周期足以使摄像头的锁相环(PLL)达到稳定 。 场同步计数比像素时钟计数的效率高得多 , 并可节省 FPGA 逻辑单元的资源 。
中间缓冲
格式转换表达式中没有体现硬件电路的延迟 。 为了从 YUV 输入生成 RGB 数据 , 需要两到三次乘法运算和三到四次加法运算 。 尽管 FPGA 逻辑电路(门电路) 的延时只有几个纳秒 , 但载波传输、加法器、移位乘法器都会导致不同程度的延时 , 使整体延时增大 。 为了使延迟最小化 , 每个常数乘法器均由两个移位输入(代表常数的 2 个非零最高有效位 MSB)的加法器近似 。 输入的 YUV 字节速率大约为 100MHz 时 , 延迟会跨越相邻像素的定时边界 , 增大图像噪声 。 在每个乘法器之后通过中间寄存器来消除扩展延时 。
以上提及的 YUV 至 RGB 彩色转换已用于 Actel? ProASIC3 A3PN125Z FPGA , 图 7 所示为实现这一 FPGA 的原理图 。
Figure 7. FPGA implementation of the YUV-to-RGB converter.Figure 7. FPGA implementation of the YUV-to-RGB converter.

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

清晰图像(PDF, 172kB)
清晰图像(PDF, 180kB)
图 7. YUV 至 RGB 转换器的 FPGA 实现
应用电路
厂家提供的摄像头芯片可能位于 PCB 子板 , 图 8 所示为摄像头子板模块的功能框图 。 输入包括电源、PWR 和晶振时钟(XCLK) 。 输出信号包含并行数据位(D0..D9)、I2C 总线(SDA、SCL)、视频同步(HREF、VSYNC)和像素时钟(PCLK) 。

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

图 8. 摄像头模块功能框图
图 9 所示为应用电路的 FPGA 和串行器芯片的原理图 。 电路通过两对双绞线组成的串行电缆供电 , 一对用于传输串行信号 , 另一对用于供电 。 独立的 LDO 电源 IC 用于串行器和 FPGA 器件 。 摄像头模块采用旁路电容 , 自带 LDO 电源芯片 , 进一步降低潜在干扰 。 FPGA 和串行器之间的数据链路采用阻尼电阻 。

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

清晰图像(PDF, 1.6MB)
图 9a. 应用电路的 FPGA 部分

与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

清晰图像(PDF, 533kB)
图 9b. 应用电路的串行器部分
MAX9259 也能够直接连接至摄像头传感器 , 例如 OV10630 , 以构建更小的摄像头 。 彩色空间转换 FPGA 可置于解串器之后 。 由于这种应用需要摄像链路输出 , 可直接由 MAX9268 驱动 , 所以彩色转换 FPGA 置于摄像头传感器和串行器(MAX9259)之间 。
视频采集示例
图 10 所示摄像头应用电路也是利用这些摄像头电路搭建的 。
与非网|如何将摄像头RGB或YUV输出转换成适合显示器的RGB数据?
本文插图

图 10. 摄像头应用电路
结论
本应用笔记介绍 Maxim 的摄像头解串器 IC 与 FPGA 配合工作的典型方案 。 提供应用原理图和 FPGA 代码 , 用于现有的参考设计 。 即将给出本应用笔记的升级版:RAW RGB 至 24 位 RGB FPGA 转换器 。


    推荐阅读