摄像头工程师说 Camera - 数据格式 YUV 格式的存储(3)

YUV 数据的存储顺序

在上一个小节 数据格式 YUV 详解 中重点讲解了 YUV 格式如何在生成数据时通过子采样减小数据量、应用数据时如何根据邻居的UV值来组合得到该像素点的Y+UV值。
数据的排列顺序也尤其重要,比如YUV444采样模式下,像素1的值可以组合成 Y1+U1+V1,也可以是Y1+V1+U1。

对于数据的组合形式,主要是三种,以YUV444采样为例:

  • Packed (or interleaved),表示Y、U、V三个数据是以交叉顺序存放的。如Y1+U1+V1+Y2+U2+V2+Y3+U3+V3.
  • Planar (or fully-planar,通常以 “p” 结尾),表示Y、U、V数据以分别成组的形式存放,如Y1+Y2+Y3+U1+U2+U3+V1+V2+V3.
  • Semi-planar (通常以 "sp"结尾)表示Y 以一组的方式存放、U+V数据以成组的方式存放,如,Y1+U1V1+Y2+U2V2+Y3+U3V3.
    不同的存储顺序导致图像处理时的程序不一样,存储空间的利用率、数据处理的效率都不一样。这里没有统一的标准,只能见招拆招。Linux 内核这里的定义可以作为参考,但定义太多太复杂了不做详细的说明了。

当 U、V 的顺序也变的重要

  • NV 开头的是一种 Semi-Planar YUV 格式。NV12,即 12bits/pixel,是YUV420 的一种,即 1 在前,表示先 U 再 V,NV21 即 1 在后,表示先 V 再 U。与此类似的是NV16,即 16bits/pixel,即 YUV422;NV24,即 24bits/pixel,即 YUV444。
  • YU,是一种Semi-planar格式,即 UV 分量中,U 在前。
  • YV,是一种Semi-planar格式,即 UV 分量中,V 在前。

示例:YUV420p:

结合上述 YUV420 的定义,对于 Planar 这种顺序,其24个像素对应的Y、U、V 的存储格式(仅显示部分像素)可以是(相同颜色的块共享 UV 向量):
摄像头工程师说 Camera - 数据格式 YUV 格式的存储(3)_第1张图片
除了比较正式的这种定义外,一些 SDK 还给这些格式起了别名,比如 YUV420p=I420 = IYUV = YV12,这不足为奇。这里不再罗列这些不是特别正式的定义,如果遇到了相关的定义欢迎与我一起讨论。

项目中常见的几种输出格式

RAW、RGB、YUV、Only Y是常见的几种图像颜色数据的组织标准。另外,在视频领域,还有 ITU-R BT.601 和 ITU-R BT.656格式,它们是 国 际 电 信 联 盟 ( International Telecommunication Union)无线通信部门(ITU-R)制定的标准,是一个传输接口标准,除了规定 RGB-YUV 转换的公式外,其还针对 YUV 格式定义了传输协议。对 YUV 格式的数据增加一些帧头、帧尾,算是一个专业的视频流格式定义。
对于这些数据格式,其常见的使用场景是:

  • 屏幕类的项目,如 运行LVGL之类的屏幕,喜欢 RGB 格式的数据。
  • 视频流类的项目,喜欢 YUV 格式的数据。
  • 图像处理类的项目,喜欢 RGB888 类型的数据,注意 OpenCV 因为历史遗留问题,其使用 BGR888 格式的数据。另外,一些图像识别的项目只关注图形的轮廓,因此喜欢 Only Y,即灰度图数据。
  • 实时游戏是带宽有限的,因此数据量更小的YUV420格式的数据是主流。
  • AI 类型的项目通常与图像、视频结合,图像类型的项目 RGB、YUV 都有,和视频类结合的项目更多的是 YUV域。

总结

1)Camera 数据格式篇 通过 数据格式 RAW、RGB(1)、数据格式 YUV 详解(2)、以及本篇内容系统地介绍了 RAW、YUV、RGB、ARGB 格式的定义。
2)本节承接上节 YUV 格式的介绍,概述了YUV 在数据存储方式上主要有Packed、Planar、Semi-planar 三种方式,不同的方式对 Y、U、V 分量的存储顺序不一样。
3)一些 以 bit 数来命名的 YUV 格式,如 NV16、NV24 其实是 YUV422、YUV444 的一种。

你可能感兴趣的:(计算机视觉,物联网,video-codec,人工智能)