Camera 之相关 YUV 知识点总结

前言

        在调试cam sensor 的过程中,不可避免的会碰到yuv相关的功能点。调试效果可能需要dump yuv 图,自己做预览需要对yuv进行转换显示等。

        这里主要是对yuv的基础概念 、分类标准、采样和存储格式进行一个记录。

        本文主要是参考网络上博客,对yuv的知识进行整理记录,附上参考链接。

目录

YUV工具

什么是YUV

YUV的采样、分类、存储格式

分类

采样

基本存储格式

packed  YUV422

Packed  YUV420

Planer  YUV422

Planer  YUV420

Semi Planer YUV422

Semi Planer YUV420

衍生存储格式

I420  --  YUV 420 Planer

YV12  --  YUV 420 Plannar

NV12  --  YUV 420 Semi-Planar

NV21  --  YUV 420 Semi-Planar

I422  --  YUV 422 Planar

YV16 --  YUV 422 Planar

NV16  -- YUV 422 Semi-Planar

NV61  --  YUV 422 Semi-Planar

YUVY  --  YUV 422 Packed Interleaved

VYUY  --  YUV 422 Packed Interleaved

UYVY  --  YUV 422 Packed Interleaved

I444  --  YUV 444 Plannar

YV24  --  YUV 444 Plannar

NV24  --  YUV 444 Semi-Planar

NV42  --  YUV 444 Semi-Planar

YUV 444 Packed

YUV422 转RGB565

RGB 转 YUV

YUV 转RGB 快速算法

整型算法

查表法

参考文献和链接


YUV工具

        先介绍一个工具,可以打开各种格式的yuv图,免费好用,附上网址。

        YUV 工具链接;

什么是YUV

        常见的颜色模型中,RGB主要用于电子系统里表达和显示颜色CMYK印刷四色模式用于彩色印刷,而YUV是被欧洲电视系统所采用的一种颜色编码方法。

        使用YUV的优点有两个:

  • YUV主要用于优化彩色视频信号传输,向后兼容老式黑白电视,这一特性用在于电视信号上。
  • YUV是数据总尺寸小于RGB格式(但用YUV444的话,和RGB888一样都是24bits)

        YUV细分的话有Y'UVYUVYCbCrYPbPr等类型,其中YCbCr主要用于数字信号

        YCbCr 是在世界数字组织视频标准研制过程中作为ITU - R BT1601 建议的一部分, 其实是YUV经过Gamma的翻版。其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, 只是在表示方法上不同而已。在YUV 家族中, YCbCr 是在计算机系统中应用最多的成员, 其应用领域很广泛,JPEG、MPEG,H264均采用此格式。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异,此即所谓的色差信号。

        其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量,是标准 YUV 的一个翻版。

        一般所讲的YUV大多是指YCbCr以下用YUV指代YCbCr

         同一幅画的彩色画面,Y分量、V分量、U分量

YUV的采样、分类、存储格式

分类

 

采样

        YUV的采样有许多种,常用的有444,422,420等。由于人眼对 Y 的敏感度远超于对 U V 的敏感,所以有时候可以多个 Y 分量共用一组 UV,这样既可以极大得节省空间,又可以不太损失质量。

        按照数据量从小到大依次是YUV 420YUV 422YUV 444

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

 

  • YUV 4:4:4采样,每一个Y对应一组UV分量。

4:4:4 Formats, 24 Bits per Pixel

全部数据量 size = w*h*3,不节省空间

  • YUV 4:2:2采样,每两个Y共用一组UV分量。

4:2:2 Formats, 16 Bits per Pixel

全部数据量 size = w*h*2,相比yuv444 节省1/3空间

  • YUV 4:2:0采样,每四个Y共用一组UV分量。

4:2:0 Formats, 12 Bits per Pixel

全部数据量 size = w*h*1.5,相比yuv444 节省1/2空间

基本存储格式

        存储格式可以分为三大类:

  • Planar:  YUV 三个分量分开存放,先存全部的Y,然后是全部的 U(V),然后是全部的 V(U)。
  • Packed: YUV 三个分量全部交错存放,YUV这样,依次存放
  • Semi Planar: Y 分量单独存放,UV 分量交错存放,先存全部的Y,剩下的UV交错存放。
    1. 结合了前两种方式的特点,Y分量分开存,UV交错存放

 

packed  YUV422

        每2个连续的Y分量公用一个UV空间,YUV 交错存储。

        UYVY422(COLOR_FormatYUV422PackedPlanar)。

Packed  YUV420

        每4个连续的Y分量公用一个UV空间,yuv 交错存储。

Planer  YUV422

        每2个连续的Y分量公用一个UV空间,先存全部的Y,然后是U(V),最后是V(U)。

        YUV422P(COLOR_FormatYUV422Planar)。

Planer  YUV420

        每4个连续的Y分量公用一个UV空间。先存全部的Y,然后是U(V),最后是V(U)。、

        YUV420P(COLOR_FormatYUV422Planar)。

Semi Planer YUV422

        每2个连续的Y分量公用一个UV空间。先存全部的Y,然后是UV交错存储。

        YUV422SP(COLOR_FormatYUV422SemiPlanar)。

Semi Planer YUV420

        每4个连续的Y分量公用一个UV空间。先存全部的Y,然后是UV交错存储。

        YUV422SP(COLOR_FormatYUV422SemiPlanar)。

衍生存储格式

I420  --  YUV 420 Planer

        I420 是 YUV 420 Planar 的一种,YUV 分量分别存放,先Y,跟U,最后是V。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U
U U U
U U U
V V V
V V V
V V V

YV12  --  YUV 420 Plannar

        YV12 是 YUV 420 Planar 的一种,YUV 分量分别存放,先是Y,后面跟V, 最后是U。

        与 I420 不同的是,YV12 是先 V 后 U。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V V V
V V V
V V V
U U U
U U U
U U U

NV12  --  YUV 420 Semi-Planar

        NV12 是 YUV 420 Semi-Planar 的一种:Y 分量单独存放,UV 分量交错存放。

        UV 在排列的时候,先U后V。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V
U V U V U V
U V U V U V

NV21  --  YUV 420 Semi-Planar

        NV21 是 YUV 420 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。

        与 NV12 不同的是,UV 在排列的时候,先 V 后 U。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U
V U V U V U
V U V U V U

I422  --  YUV 422 Planar

        I422 是 YUV 422 Planar 的一种,YUV 分量分别存放,先是Y,跟U, 最后是V。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U U U U
U U U U U U
U U U U U U
V V V V V V
V V V V V V
V V V V V V

YV16 --  YUV 422 Planar

        YV16 是 YUV 422 Planar 的一种,YUV 分量分别存放,先是Y,后面跟V, 最后是U。

        与 I422 不同的是,YV16 是先 V 后 U。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V V V V V V
V V V V V V
V V V V V V
U U U U U U
U U U U U U
U U U U U U

NV16  -- YUV 422 Semi-Planar

        NV16 是 YUV 422 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。

        UV 在排列的时候,先 U 后 V。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V
U V U V U V
U V U V U V
U V U V U V
U V U V U V
U V U V U V

NV61  --  YUV 422 Semi-Planar

        NV61 是 YUV 422 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。

        UV 在排列的时候,先 V 后 U。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U
V U V U V U
V U V U V U
V U V U V U
V U V U V U
V U V U V U

YUVY  --  YUV 422 Packed Interleaved

        YUVY 属于 YUV 422 Interleaved 的一种。

        事实上 Interleaved 是属于 Packed 的,但是在 422 中,用 Interleaved 更加形象一些。

        在 Packed 内部,YUV 的排列顺序是 Y U V Y,两个 Y 共用一组 UV。

Y U V Y   Y U V Y   Y U V Y
Y U V Y   Y U V Y   Y U V Y
Y U V Y   Y U V Y   Y U V Y
Y U V Y   Y U V Y   Y U V Y
Y U V Y   Y U V Y   Y U V Y
Y U V Y   Y U V Y   Y U V Y

VYUY  --  YUV 422 Packed Interleaved

        VYUY 属于 YUV 422 Interleaved 的一种。

        在 Packed 内部,YUV 的排列顺序是 VYUY,两个 Y 共用一组 UV。

V Y U Y   V Y U Y   V Y U Y
V Y U Y   V Y U Y   V Y U Y
V Y U Y   V Y U Y   V Y U Y
V Y U Y   V Y U Y   V Y U Y
V Y U Y   V Y U Y   V Y U Y
V Y U Y   V Y U Y   V Y U Y

UYVY  --  YUV 422 Packed Interleaved

        UYVY 属于 YUV 422 Interleaved 的一种。

        在 Packed 内部,YUV 的排列顺序是 UYVY,两个 Y 共用一组 UV。

U Y V Y   U Y V Y   U Y V Y
U Y V Y   U Y V Y   U Y V Y
U Y V Y   U Y V Y   U Y V Y
U Y V Y   U Y V Y   U Y V Y
U Y V Y   U Y V Y   U Y V Y
U Y V Y   U Y V Y   U Y V Y

I444  --  YUV 444 Plannar

        I444 属于 YUV 444 Plannar 的一种。

        YUV 分量分别存放,先是Y,后面跟U。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V

YV24  --  YUV 444 Plannar

        YV24 属于 YUV 444 Plannar 的一种,YUV 分量分别存放,先是Y,后面跟V,最后是U。

        与 I444 不同的是,YV24 是先排列 V。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
V V V V V V
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U
U U U U U U

NV24  --  YUV 444 Semi-Planar

        NV24 是 YUV 444 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。

        UV 在排列的时候,从 U 开始。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U V U V U V U V U V U V 
U V U V U V U V U V U V 
U V U V U V U V U V U V 
U V U V U V U V U V U V 
U V U V U V U V U V U V 
U V U V U V U V U V U V 

NV42  --  YUV 444 Semi-Planar

        NV42 是 YUV 444 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放。

        UV 在排列的时候,从 V 开始。

Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U

YUV 444 Packed

Y U V   Y U V   Y U V   Y U V   Y U V   Y U V
Y U V   Y U V   Y U V   Y U V   Y U V   Y U V
Y U V   Y U V   Y U V   Y U V   Y U V   Y U V
Y U V   Y U V   Y U V   Y U V   Y U V   Y U V
Y U V   Y U V   Y U V   Y U V   Y U V   Y U V
Y U V   Y U V   Y U V   Y U V   Y U V   Y U V

YUV422 转RGB565

        自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。我们比较常接触到的就包括 RGB / CMYK / YIQ / YUV / HSI等等。

        对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV这两种(实际上这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …)。

        RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。即使只是RGB YUV这两大类色彩空间,所涉及到的知识也是十分丰富复杂的。

        Camera Sensor中最常用的 YUV 模型是 YUV422 格式,因为它采用4个字节描述两个像素,能和RGB565模型比较好的兼容。有利于Camera SensorCamera controller的软硬件接口设计。

        YUV模型用于PAL制式的电视系统,Y表示亮度,UV并非任何单词的缩写

        YIQ模型与YUV模型类似,用于NTSC制式的电视系统YIQ颜色空间中的IQ分量相当于将YUV空间中的UV分量做了一个33度的旋转。

        YCbCr颜色空间是由YUV颜色空间派生的一种颜色空间,主要用于数字电视系统中。从RGBYCbCr的转换中,输入、输出都是8位二进制格式

RGB YUV

  • Y=0.30R + 0.59G + 0.11B
  • U=0.493(BY)
  • V=0.877(RY)

        从公式中,我们关键要理解的一点是,UV / CbCr信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助。

YUV RGB 快速算法

        这里指的YUV实际是YcrCb了,YUV2RGB的转换公式本身是很简单的,但是牵涉到浮点运算,所以,如果要实现快速算法,算法结构本身没什么好研究的了,主要是采用整型运算或者查表来加快计算速度。

        首先可以推导得到转换公式为:

  • R = Y + 1.4075 *(V-128)
  • G = Y – 0.3455 *(U –128) – 0.7169 *(V –128)
  • B = Y + 1.779 *(U – 128)

整型算法

        要用整型运算代替浮点运算,当然是要用移位的办法了,我们可以很容易得到下列算法:

  • u = YUVdata[UPOS] - 128;
  • v = YUVdata[VPOS] - 128;

  • rdif = v + ((v * 103) >> 8); // (1+103/256 = 1.4023)*v
  • invgdif = ((u * 88) >> 8) +((v * 183) >> 8); // (u*0.3437 + v*0.7148)
  • bdif = u +( (u*198) >> 8); // (1 + 198/256 = 1.7734) *u

  • r = YUVdata[YPOS] + rdif;
  • g = YUVdata[YPOS] - invgdif;
  • b = YUVdata[YPOS] + bdif;

        要从RGB24转换成RGB565数据还要做移位和或运算:

RGBdata[1] =( (r & 0xF8) | ( g >> 5) );

RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );

查表法

        略。

附件

        YUV422 转 RGB565实现代码

        C代码;

参考文献和链接

https://www.jianshu.com/p/538ee63f4c1c

https://www.jianshu.com/p/3e44c2262775

https://www.cnblogs.com/huaping-audio/archive/2009/12/27/1633624.html

http://blog.sina.com.cn/s/blog_475e9bf20100siir.html

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要获取Camera2的YUV帧,您需要创建一个`ImageReader`对象,并在`ImageReader.OnImageAvailableListener`回调中获取帧数据。以下是使用Camera2 API获取YUV帧的基本步骤: 1. 创建`ImageReader`对象: ``` ImageReader imageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 1); ``` 这里的`width`和`height`是您要获取的帧的分辨率。 2. 在`ImageReader.OnImageAvailableListener`回调中获取帧数据: ``` imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); ByteBuffer yBuffer = planes[0].getBuffer(); ByteBuffer uBuffer = planes[1].getBuffer(); ByteBuffer vBuffer = planes[2].getBuffer(); // TODO: 处理YUV帧数据 image.close(); } } }, null); ``` 在这个回调中,您可以调用`acquireLatestImage()`方法来获取最新的帧数据。然后,您可以通过`Image.getPlanes()`方法获取帧数据的各个平面,包括Y、U和V平面。最后,您可以从每个平面的`ByteBuffer`中获取相应的数据。 3. 启动相机预览: ``` CameraDevice cameraDevice = // 获取相机设备 Surface surface = imageReader.getSurface(); CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); requestBuilder.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { try { session.setRepeatingRequest(requestBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } }, null); ``` 这里,您需要将`ImageReader`的`Surface`添加为相机预览的目标,并使用`CameraCaptureSession`启动相机预览。 这就是使用Camera2 API获取YUV帧的基本步骤。请注意,您还需要处理帧数据的格式转换和显示等问题,具体取决于您的应用程序需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值