YUV是一种颜色编码方法,Y表示亮度(Luma),也就是灰度值。U分量和V分量重存储了是色度(Chroma)信息,主要作用是描述了视频的色彩及饱和度,用于指定每个像素的颜色。主要用于电视系统以及模拟视频领域,它将亮度信息Y与色彩信息UV分离,没有UV信息一样可以显示完整的图像,显示出来将是黑白效果,解决了彩色电视机和黑白电视机之间的兼容问题。早期的黑白电视机只有亮度值Y,后面彩色电视的出现引入了UV分量,形成了现有的YUV格式,又称为YCbCr格式。
YUV格式的优点。由于人眼对亮度敏感而对色度不敏感的特点,因此在YUV格式中减少了UV的数据量,在不影响用户观看的情况下有效的压缩了总体的数据量。所以YUV与RGB格式相比,占用更少的存储空间,相对应的在传输过程中也会减少带宽的消耗量。

常见的YUV格式有YUV444、YUV422、YUV420。
对于YUV444格式,一个Y分量对应一组UV分量,及完全采样。如下图所示:

对于YUV422格式,每两个Y公用一组UV分量。如下图所示:


对于YUV420格式,并不是说只有Y分量和U分量,没有V分量。U分量和V分量是交替出现的,例如第一行为4:2:0,则第二行为4:0:2,如此反复依次交替。

YUV444、YUV422、YUV420几种格式中最常用的就是YUV420格式了。YUV420格式又可以细分为YUV420P和YUV420SP两种类型。

YUV420P是三平面存储,Y、U、V三个分量分别占用一个平面。数据的排列方式有I420,YV12。
I420,YYYYYYYY UUVV
YV12,YYYYYYYY VVUU

YUV420SP是两平面存储,Y分量占用一个平面,UV分量公用一个平面。有两种排列方式NV12、NV21
NV12,YYYYYYYY UVUV
NV21,YYYYYYYY VUVU

RGB是一种对颜色进行编码的方式。由RGB(红、绿、蓝)经过叠加组合可以展现出所有的色彩,每种颜色都可以由这三个变量的不同值组合而成。记录一张图像时,最常用的编码方式就是RGB。

YUV的主要优势在于可以兼容之前的黑白电视,单独只有Y数据就可以显示完整的黑白图像,UV是后期加入的色彩参数。并且经过多年的发展,YUV的压缩算法得到了改进,使得图像的压缩率大大增加。使得YUV比RGB占用更少的存储空间。虽然YUV很有优势,但是在最终显示的时候其本质上也都是显示的RGB数据,一些支持YUV输入的设备,内部也是做了相应的转换。

YUV格式在存储上存在两类布局:

YUV根据Y、U、V存储方式的不同,可以分成两个格式:

紧缩格式(packed):每个像素点的Y、U、V连续存储,Y1U1V1…YnUnVn。
平面格式(planar):先存储所有像素点的Y分量,再存储所有像素点的UV分量,Y和UV分别连续存储在不同矩阵当中。

Packed:把相邻的几个像素打包起来;比如把水平方向2个像素打包到一个DWORD
Plannar:方式相反;Y分量和UV分量完全分开来保存

YUY2YV12是最常用的两个代表

  • YUY2是packed方式的。水平方向两个像素打包到一个DWORD,并且UV采样率只有Y的一半,这符合人的视觉特征能有效的压缩数据,具体布局为[Y0, U0,Y1,V0]。 这种格式常见于MPEG1的解码器。

  • YV12则常见于H.264的解码器,它属于plannar方式。对于一个MxN大小的视频来说,数据布局为[Y:M x N] [V:M/2 x N/2] [U:M/2 x N/2]. 也就是说UV的采样率在水平和垂直方向上都只有Y的一半。
    平面格式(planar)又分为:

平面格式(planar):先存储所有像素的Y,再存储所有像素点U或者V,最后存储V或者U。其中U、V分别连续存储:Y1…Yn U1…Un V1…Vn 或者 Y1…Yn V1…Vn U1…Un。
半平面格式(semi-planar):先存储所有像素的Y,再存储所有像素点UV或者VU。其中U、V交替存储:Y1…Yn U1V1…UnVn 或者 Y1…Yn V1U1…VnUn。
采样方式采用YUV420、存储方式采用平面格式(planar)称为YUV420P。YUV420P根据U和V顺序不同又分为:

I420: Y1…Y4n U1…Un V1…Vn (例如:YYYYYYYYUUVV)
YV12:Y1…Y4n V1…Vn U1…Un (例如:YYYYYYYYVVUU)
采样方式采用YUV420、存储方式采用半平面格式(semi-planar)称为YUV420SP,YUV420SP根据U和V顺序不同又分为:

NV12: Y1…Y4n U1V1…UnVn (例如:YYYYYYYYUVUV)
NV21:Y1…Y4n V1U1…VnUn (例如:YYYYYYYYVUVU)

YUV_420_888

多平面Android YUV 420格式

此格式是通用的YCbCr格式,能够描述任何4:2:0色度采样的平面或半平面缓冲区(但不完全交织),每个颜色样本有8位。

这种格式的图像始终由三个单独的数据缓冲区表示,每个颜色缓冲区一个。 缓冲区中始终会附带其他信息,描述每个平面的行步长和像素步长。

确保Image#getPlanes()返回的数组中平面的顺序,使得平面#0始终为Y,平面#1始终为U(Cb),平面#2始终为V(Cr)。

保证Y平面不与U / V平面交错(特别是yPlane.getPixelStride()中的像素步长始终为1)。

确保U / V平面具有相同的行步长和像素步长(尤其是uPlane.getRowStride()== vPlane.getRowStride()和uPlane.getPixelStride()== vPlane.getPixelStride();)。

YUV_420_888使用实践
根据API中的介绍,我们可以知道,YUV_420_888是可以兼容所有YUV420P和YUV420SP格式的。也就是说上面提到的I420、YV12、NV12、NV21都可以是YUV_420_888的具体实现

I420、YV12、NV12、N21转RGBA

I420、YV12、NV12、N21转换时都有一些共性:

每个像素有自己独立的Y分量,Y的数量与像素点数量相等。
4个像素共用一个U分量和V分量。
因此,我们只要找到每个像素Y、U、V分量的对应关系就可以进行转换。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/src/org/tensorflow/demo/

opencv YUV -> RGB

https://github.com/qiuxintai/YUV420Converter

#include <stdint.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>#include "logger.h"
#include "opencv_utils.h"using namespace std;
using namespace cv;void opencvI420ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {Mat srcImg(height * 3 / 2, width, CV_8UC1, src);Mat dstImg(height, width, CV_8UC4, dst);cvtColor(srcImg, dstImg, CV_YUV2RGBA_I420);
}void opencvYV12ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {Mat srcImg(height * 3 / 2, width, CV_8UC1, src);Mat dstImg(height, width, CV_8UC4, dst);cvtColor(srcImg, dstImg, CV_YUV2RGBA_YV12);
}void opencvNV12ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {Mat srcImg(height * 3 / 2, width, CV_8UC1, src);Mat dstImg(height, width, CV_8UC4, dst);cvtColor(srcImg, dstImg, CV_YUV2RGBA_NV12);
}void opencvNV21ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {Mat srcImg(height * 3 / 2, width, CV_8UC1, src);Mat dstImg(height, width, CV_8UC4, dst);cvtColor(srcImg, dstImg, CV_YUV2RGBA_NV21);
}

libyuv YUV -> RGB

https://github.com/hzl123456/LibyuvDemo

#include <stdint.h>
#include <libyuv/convert.h>
#include <libyuv/convert_argb.h>
#include <libyuv/convert_from.h>
#include <libyuv/rotate.h>
#include <libyuv/rotate_argb.h>#include "logger.h"
#include "libyuv_utils.h"using namespace std;
using namespace libyuv;void libyuvI420ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {unsigned char *pY = src;unsigned char *pU = src + width * height;unsigned char *pV = src + width * height * 5 / 4;I420ToABGR(pY, width, pU, width >> 1, pV, width >> 1, dst, width * 4, width, height);
}void libyuvYV12ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {unsigned char *pY = src;unsigned char *pU = src + width * height * 5 / 4;unsigned char *pV = src + width * height;I420ToABGR(pY, width, pU, width >> 1, pV, width >> 1, dst, width * 4, width, height);
}void libyuvNV12ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {unsigned char *pY = src;unsigned char *pUV = src + width * height;NV12ToABGR(pY, width, pUV, width, dst, width * 4, width, height);
}void libyuvNV21ToRGBA(unsigned char *src, unsigned char *dst, int width, int height) {unsigned char *pY = src;unsigned char *pUV = src + width * height;NV21ToABGR(pY, width, pUV, width, dst, width * 4, width, height);

参考:
https://www.jianshu.com/p/944ede616261

AOSP ~ Camera - YUV格式简介相关推荐

  1. RGB与YUV格式简介

    (1) RGB格式简介 RGB色彩模式是一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的.图像中每一个像素的RGB分量都分配一个0~25 ...

  2. python opencv把yuv格式转bgr

    1.yuv格式简介 yuv格式不同于bgr. YUV ,指的是 YCbCr,其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量. 根据采样方式以及排列方式分了好多种细致的格式,常用的有yuy ...

  3. SDI视频数据流格式简介(频率、速率、YUV、EAV、SAV)

    文章目录 SDI视频格式简介 SDI视频流数据格式 示意图 SDI视频格式简介 ​ 常见的SDI视频格式主要包括SD-SDI.HD-SDI.3G-SDI三种,其比特率依次增加,也对应着不同分辨率和刷新 ...

  4. SDI视频数据流格式简介(频率、速率、YUV、EAV、SAV)(转载)

    频率 = 行周期 * 场周期 * 刷新率速率 = 频率*位宽 以常见的1080P.30fps的视频的时序图为例,主要由三个信号组成H.V.DE.其有效像素的分辨率为1920x1080,算上消隐期,其像 ...

  5. linux_驱动_V4l2层_camera_应用层调用流程_MIPI协议包格式简介

    一. 摄像头基础介绍 1.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电 ...

  6. 使用 8 位 YUV 格式的视频呈现

    发布日期 : 12/9/2004 | 更新日期 : 12/9/2004 Gary Sullivan 和 Stephen Estrop Microsoft Digital Media Division ...

  7. yuv420p 详解_Android中的YUV格式解析

    一.YUV格式 YUV 表示三个分量, Y 表示 亮度(Luminance),即灰度值,UV表示色度(Chrominance),描述图像色彩和饱和度,指定颜色.YUV格式有YUV444. YUV422 ...

  8. 【作业】RGB/BMP转YUV格式及YUV视频拼接

    简介 RGB文件 RGB文件是原始的没有压缩的包含红绿蓝三种颜色的图像文件. 常见的RGB格式例如RGB24,也就是一组RGB像素中的R.G.B各占8比特,即一个字节,一组RGB一共是24个比特. 这 ...

  9. 视频与图像RGB/YUV格式详解

    计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red).G(Green).B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红.绿.蓝磷光材料发光而产生色彩. ...

  10. vs2010MFC D3D播放YUV格式视频详细制作全过程

    1.环境配置 1.1 Microsoft Visual Studio 2010安装 先下载Visual Studio 2010,然后双击setup.exe安装,安装时有一步选择vc++安装就可以了,其 ...

最新文章

  1. Android 的NDK的Makefile编写
  2. c语言10000以内的质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  3. mysql excel 命令行_MySQL 命令行数据导出到 Excel
  4. Android Get方式发送信息
  5. 屏幕的宽度_交互规范:响应式让屏幕利用更高,用户体验更佳
  6. 【10.1】python中的GIL
  7. excel 显示超链接_临下班老板让我创建几百个超链接跳转,我就用了1秒,绝不加班...
  8. IDEA 2017 破解方法(附图)
  9. 基于java(ssm)校园办公室报修管理系统(java毕业设计)
  10. 火车头采集html5游戏,火车头采集网站内页URL(图文)教程!
  11. Linux ipv6设置
  12. vue 解决跨域问题
  13. 关于光的波粒二象性的解释--答复年少时的疑惑
  14. 墨尔本大学计算机科学要求,墨尔本大学计算机科学
  15. 关于.Net的面试遐想
  16. python 微信自动回复_python微信机器人自动回复
  17. 【border相关】【P3426】 [POI2005]SZA-Template
  18. Max-Min 带宽公平分配算法
  19. 基于MXL90614设计温度传感器
  20. 从艾优尼之死,看Freeme OS的深远价值

热门文章

  1. C语言中callback回调函数,知识分享:C 语言函数指针之回调函数
  2. web与app开发java_移动web开发和移动app开发的区分
  3. MODIS数据下载——订单模式下载tif影像
  4. 【OR】YALMIP 整数规划
  5. 计算机中win是哪个版本,win7系统应该选择哪个版本比较好
  6. vs13配置matlab,VS配置电脑系统变量(VS2013+matlab2018a)
  7. C功底挑战Java菜鸟入门概念干货(三)
  8. Redies tutorial
  9. cass等距离等分线段的命令键_cad等分快捷键(cad等分线段快捷键命令)
  10. 使用Java快速开发一个新闻爬虫项目