首页 未命名正文

linux编程_图文详解YUV420数据格式

云返利网 未命名 2020-05-26 09:07:47 13 0

YUV花样有两大类:planar和packed。
对于planar的YUV花样,先延续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV花样,每个像素点的Y,U,V是延续交*存储的。

YUV,分为三个分量,“Y”示意明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 示意的则是色度(Chrominance或Chroma),作用是形貌影像色彩及饱和度,用于指定像素的颜色。

   与我们熟知的RGB类似,YUV也是一种颜色编码方式,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)星散,没有UV信息一样可以显示完整的图像,只不过是是非的,这样的设计很好地解决了彩色电视机与是非电视的兼容问题。而且,YUV不像RGB那样要求三个自力的视频信号同时传输,以是用YUV方式传送占用少少的频宽。

YUV码流的存储花样实在与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章领会,这里我想强调的是若何凭据其采样花样来从码流中还原每个像素点的YUV值,由于只有正确地还原了每个像素点的YUV值,才气通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。

    用三个图来直观地示意采集的方式吧,以黑点示意采样该像素点的Y分量,以空心圆圈示意接纳该像素点的UV分量。

 

先记住下面这段话,以后提取每个像素的YUV分量会用到。

  1. YUV 4:4:4采样,每一个Y对应一组UV分量。
  2. YUV 4:2:2采样,每两个Y共用一组UV分量。 
  3. YUV 4:2:0采样,每四个Y共用一组UV分量。 

2.  存储方式

    下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方式,其中,Cb、Cr的寄义等同于U、V。

(1) YUVY 花样 (属于YUV422)

  YUYV为YUV422采样的存储花样中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,剖析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。 (2) UYVY 花样 (属于YUV422)   UYVY花样也是YUV422采样的存储花样中的一种,只不过与YUYV差别的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方式与上面一样。   (3) YUV422P(属于YUV422)   YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交织存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方式也是遵照YUV422花样的最基本提取方式,即两个Y共用一个UV。好比,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。 (4)YV12,YU12花样(属于YUV420)

YU12和YV12属于YUV420花样,也是一种Plane模式,将Y、U、V分量划分打包,依次存储。其每一个像素点的YUV数据提取遵照YUV420花样的提取方式,即4个Y分量共用一组UV。注重,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。

(5)NV12、NV21(属于YUV420)

 

NV12和NV21属于YUV420花样,是一种two-plane模式,即Y和UV分为两个Plane,然则UV(CbCr)为交织存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00

YUV420 planar数据, 以720×488巨细图象YUV420 planar为例,

其存储花样是: 共巨细为(720×480×3>>1)字节,

分为三个部门:Y,U和V

Y分量:    (720×480)个字节 

U(Cb)分量:(720×480>>2)个字节

V(Cr)分量:(720×480>>2)个字节

三个部门内部均是行优先存储,三个部门之间是Y,U,V 顺序存储。

即YUV数据的0--720×480字节是Y分量值,        

720×480--720×480×5/4字节是U分量    

720×480×5/4 --720×480×3/2字节是V分量。

4 :2: 2 和4:2:0 转换:

最简朴的方式:

YUV4:2:2 ---> YUV4:2:0  Y稳定,将U和V信号值在行(垂直偏向)在举行一次隔行抽样。 YUV4:2:0 ---> YUV4:2:2  Y稳定,将U和V信号值的每一行划分拷贝一份形成延续两行数据。

在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V。对于所有YUV420图像,它们的Y值排列是完全相同的,由于只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据花样它们的UV排列在原理上是完全差别的。420p它是先把U存放完后,再存放V,也就是说UV它们是延续的。而420sp它是UV、UV这样交替存放的。(见下图) 有了上面的理论,我就可以准确的计算出一个YUV420在内存中存放的巨细。 width * hight =Y(总和) U = Y / 4   V = Y / 4

 

以是YUV420 数据在内存中的长度是 width * hight * 3 / 2,

假设一个分辨率为8X4的YUV图像,它们的花样如下图:

                      YUV420sp花样如下图                                                         

 

            

                       YUV420p数据花样如下图

           

 

旋转90度的算法:

public static void rotateYUV240SP(byte[] src,byte[] des,int width,int height)
 {
   
  int wh = width * height;
  //旋转Y
  int k = 0;
  for(int i=0;i<width;i++) {
   for(int j=0;j<height;j++)
   {
              des[k] = src[width*j + i];   
        k++;
   }
  }
 
  for(int i=0;i<width;i+=2) {
   for(int j=0;j<height/2;j++)
   { 
              des[k] = src[wh+ width*j + i]; 
              des[k+1]=src[wh + width*j + i+1];
        k+=2;
   }
  }
 
 
 }

 

YV12和I420的区别        一般来说,直接采集到的视频数据是RGB24的花样,RGB24一帧的巨细size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV尺度花样4:2:0)的数据量是 size=width×heigth×1.5 Bit。       在采集到RGB24数据后,需要对这个花样的数据举行第一次压缩。即将图像的颜色空间由RGB2YUV。由于,X264在举行编码的时刻需要尺度的YUV(4:2:0)。然则这里需要注重的是,虽然YV12也是(4:2:0),然则YV12和I420���却是差别的,在存储空间上面有些区别。如下: YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)

I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)

可以看出,YV12和I420基本上是一样的,就是UV的顺序差别。

继续我们的话题,经由第一次数据压缩后RGB24->YUV(I420)。这样,数据量将削减一半,为什么呢?呵呵,这个就太基础了,我就不多写了。同样,如果是RGB24->YUV(YV12),也是削减一半。然则,虽然都是一半,如果是YV12的话效果就有很大损失。然后,经由X264编码后,数据量将大大削减。将编码后的数据打包,通过RTP实时传送。到达目的地后,将数据取出,举行解码。完成解码后,数据仍然是YUV花样的,以是,还需要一次转换,这样windows的驱动才可以处置,就是YUV2RGB24。

YUY2  是 4:2:2  [Y0 U0 Y1 V0]

 

yuv420p 和 YUV420的区别 在存储花样上有区别 yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)