1. Camera Driver中帧格式
Camera硬件设备通过V4L2Driver向上层传输帧数据,不同的Camera设备可提供的帧数据格式(图像格式)也略有不同。
v4l2_fourcc支持的格式:/linux/vidiodev2.h定义
logitech C922网络摄像头
- format:YUV 4:2:2 (YUYV) value:1448695129(YUYV)V4L2_PIX_FMT_YUYV
- format:MJPEG value:1196444237(MJPG)V4L2_PIX_FMT_MJPEG
logitech C920网络摄像头
- format:
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数据格式转换