Android 颜色空间

1. Camera Driver中帧格式

Camera硬件设备通过V4L2Driver向上层传输帧数据,不同的Camera设备可提供的帧数据格式(图像格式)也略有不同。

v4l2_fourcc支持的格式:/linux/vidiodev2.h定义

  1. logitech C922网络摄像头

    • format:YUV 4:2:2 (YUYV) value:1448695129(YUYV)V4L2_PIX_FMT_YUYV
    • format:MJPEG value:1196444237(MJPG)V4L2_PIX_FMT_MJPEG
  2. logitech C920网络摄像头

    • format:
  1. HDMI rx输入源

    • format:Y/CbCr 4:2:2 value:909203022(NV16)V4L2_PIX_FMT_NV16
    • format:YUV 4:2:0 (NV12) value:842094158(NV12)V4L2_PIX_FMT_NV12
    • format:YUV 4:2:0 (NV21) value:825382478(NV21)V4L2_PIX_FMT_NV21
    • format:RGBA value:876758866(RGB4)V4L2_PIX_FMT_RGB32
    • format:ARGB value:875708738(BA24)

2. 颜色空间的介绍

2.1.RGB 概念

RGB即光的三原色(Red,Green,Blue)。物理上,我们所看到的光可以由这三种颜色按照一定的比例混合得到。

在RGB模型中,可以通过控制这三种颜色的亮度来实现不同比例的混合,RGB的亮度值可以形成一个空间坐标系,空间坐标系中的每一个点都代表模型中的一种颜色。在RGB的颜色空间中,当所有基色的亮度为0时,显示为黑色;当三种基色都达到最大时,表现为白色。在连接黑色和白色的连线上,是亮度等亮的三基色混合而成的灰色,该线称为灰色线。

应用于显示器等发光体的显示。

拓展:

  • 光的三基色模型(红,绿,蓝),属于加色模型。
  • 颜料的三原色(红,黄,蓝),属于减色模型,它们是光三原色的补色,可以吸收对应的光线。

2.2.YUV 概念

YUV概念,YUV是被欧洲电视系统所采用的一种颜色编码方式。其中,Y代表亮度,即图像的灰度值;UV代表色差(色度),U(B-Y)和V(R-Y)是构成彩色的两个分量。

YUV出现的主要原因,用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。

人眼对明视度的改变比对色彩的改变要敏感很多,所以Y分量比UV分量更重要,所以可以适当的抛弃U和V分量来达到压缩的目的,即部分取样。

2.3.YUV与YCbCr的关系

YCbCr颜色空间是由YUV颜色空间派生出的一种颜色空间。

YCbCr是在世界数字组织视频标准研制过程中产生。其中,Y指亮度分量,Cr红色色度分量,Cb蓝色色度分量。YUV家族中,YCbCr在计算机系统中应用最多,JPEG,MPEG均采用此格式。一般人讲的YUV大多指YCbCR。

2.4.YUV采样与存储格式

YUV的主要的采样格式:

YCbCr 4:2:0 YCbCr 4:2:2 YCbCr 4:1:1 YCbCr 4:4:4

假定四个像素:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

(1) YUV 4:4:4,无压缩采样,YUV三个信道的抽样率相同。每个分量占用8bit,水平方向上每个像素占用3个字节。

抽样后存放的码流:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

(2) YUV 4:2:2,压缩率33.3%,每个色度分量的抽样是亮度分量的一半,水平方向上每两个像素占用4个字节。

抽样后存放的码流:Y0 U0 Y1 V1 Y2 U2 Y3 V3

还原后:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

(3) YUV 4:1:1,压缩率50%,在水平上对色度分量进行4:1抽样。水平方向上每四个像素占用6个字节。

抽样后存放的码流:Y0 U0 Y1 Y2 V2 Y3

还原后:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

(4) YUV 4:2:0,压缩率50%,即在水平上对色度进行2:1抽样,竖直方向对色度也进行2:1抽样。

假定八个像素:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]|[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]

抽样后存放的码流:Y0 U0 Y1 Y2 U2 Y3 | Y5 V5 Y6 Y7 V7 Y8

还原后:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]|[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]

YUV的存储格式:

通常有两大类,即打包格式、平面格式和半平面格式。

(1)打包格式(packed format),将YUV分量放在同一个数组中,和RGB的存放方式相同。

(2)平面格式(planar format),YUV分量都是以独立的平面组织,YUV分开存储,每个分量各占一个地方,其中UV占Y的一半。该格式中,每一个像素占12bits,平面格式有:I420(YUV420P,U前V后)、YV12(YUV420P,V前U后)等。

YV12,YU12格式(属于YUV420P)

(3)半平面格式(semi-planar format),Y单独占一块地方,UV合占一块地方,依据UV的顺序,又分为NV12(YUV420SP,U前V后)和NV21(YUV420SP,V前U后)。

NV12、NV21(属于YUV420SP)

2.5.YUV、YCrCb与RGB的转换公式

2.5.1.YUV到RGB的转换
  • Y = 0.299R + 0.587G+ 0.114B
  • U = -0.147R -0.289G + 0.436B
  • V = 0.615R - 0.515G- 0.100B
  • R = Y + 1.14V
  • G = Y - 0.39U - 0.58V
  • B = Y + 2.03U
2.5.2.YUV420P到YUV420SP的转换

3.帧数据存储的内存对齐概念

内存对齐,现在计算机的CPU都是32位或64位的CPU,他们一次最小读取4到8个字节,如果少于这些,反而要做一些额外的工作,花费更长的时间,于是内存对齐就变得很有必要(使用空间来换取时间),将结构体的长度设为4、8的倍数。

图像数据存储的16位对齐,其实是针对I420和YV12这种YUV420P格式来说的。

CPU或GPU在处理图像数据的过程中,需要从内存中获取或存储图像数据,如果以像素(3byte)为单位,则效率很低下,所以通常是以stride为最小单位(按行操作)。

stride步距(跨距),内存中每行像素所占的空间,这是一个大于等于图像宽度的内存对齐长度。一般来说步距等于图像的宽度,但是为了实现内存对齐,stride值有时候并不等于image width。

4.Android系统中使用的色彩空间

YUV 420P即(I420),YUV三种分量分别存储,stride方式,16位对齐。

PixelFormat for graphics buffers 定义头文件


参考资料

[1] 颜色空间YUV简单介绍

[2] V4L api介绍

[3] 对颜色空间YUV、RGB的理解

[4] YUV格式转换中stride

[5] YUV数据格式转换