Ps:总结归纳一下自己工作中遇到的一些关于YUV格式的知识点和问题。水平有限,写的不太完整,后续会不断完善。如果有错误和不足之处,还请各位不吝赐教。

YUV格式简介

  • YUV,是一种颜色编码方法。YUV,YCbCr,YPbPr等专有名词都可以称为YUV。Y表示亮度、U(Cb)V(Cr)表示色度。
  • YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间。
  • 在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。

YUV的存储格式

通常分为:
1.打包(Packed)格式;
像素点的Y、U、V是连续交替存储的。

YUV/YUV/YUV/YUV/YUV/YUV....

2.平面(Planar)格式;
像素点的Y、U、V,是分别连续存储的。相当于将YUV拆成三个平面存储。

YYYYYY/UUUUUU/VVVVVV...

3.平面格式又有Semi-Planar的类别;
像素点的Y是连续存储的,U、V分量是交叉存放的。

YYYYYY/UV/UV/UV/UV/UV/UV...

YUV的采样方式

主流有:
1.YUV444:每一个Y分量对应一组UV分量,平均一个像素占用8+8+8=24位。
2.YUV422:每两个Y分量共用一组UV分量,8+4+4=16位。

YUVY / UYVY / YUV422P / YUY2  ,此处要注意,YUY2是packed打包格式的。

3.YUV420:每四个Y分量共用一组UV分量,8+4+0=12位。

YUV420P :YV12、YU12 是一种Planar格式。两者的区别是:YU12存储顺序是YUV,即YCbCr。YV12,存储顺序是YVU,即YCrCb。
YUV420SP:NV12、NV21 是一种Semi-Planar格式。NV12是IOS的模式,NV12是Android的模式。 其实nv系列,都属于semi-plane系列

4.YUV411:每四个Y分量共用一组UV分量,8+2+2=12位。

此处借用一张图来补充说明三种采样方式的差别:

注意要把YUV的采样方式和存储格式结合起来分析:

对于Planar的YUV格式,Y、U、V分别连续存储。
对于Packed的YUV格式,Y、U、V连续交替存储。

对于每种方式的Size大小,可借鉴以下方式分析:

YUV-sp422:宽(Stride) * 高 * 2
YUV-sp420:宽(Stride) * 高 * 1.5
YUV-400:  宽(Stride) * 高
//YUV-SP422
|-Width(Stride)-|
Y    Y    Y    Y     --    --
Y    Y    Y    Y   Heigth
Y    Y    Y    Y
Y    Y    Y    Y     --
U    V    U    V         Heigth * 2
U    V    U    V
U    V    U    V
U    V    U    V           --//YUV-SP420
|-Width(Stride)-|
Y    Y    Y    Y     --    --
Y    Y    Y    Y   Heigth
Y    Y    Y    Y
Y    Y    Y    Y     --
U    V    U    V         Heigth * 1.5
U    V    U    V           --

以海思芯片(hisi35xx)为例,在视频处理子系统(VPSS)上,通过接口获取的一帧处理完成的图像,这里我们以NV21的采样格式,SP420的打包格式 来讲。

在通过接口HI_MPI_VPSS_GetChnFrame获得指向视频图像帧信息结构体( VIDEO_FRAME_INFO_S)的指针后,我们需要抽出其中的视频原始图像帧结构( VIDEO_FRAME_S)。
我们可通过该结构获得其中的宽度、高度、像素格式、跨距、物理地址、虚拟地址等信息。

这里讲一下图像跨距(stride)的概念。
不同于图像的宽度,图像跨距又叫扫描宽度,是单行像素(一个扫描行)的宽度。当视频图像存储在内存时,图像的每一行末尾可能包含一些扩展内容,这些扩展的内容只影响图像如何存储在内存中,但是不影响图像如何显示出来。如果每一行像素末尾拥有扩展内容,Stride的值一定大于图像的宽度值。所以在处理一个视频帧时,在计算的时候必须把stride也计算进去。

1.在得到帧图像的各种信息后,首先我们从内存中映射出可供用户进程操作的地址。

HI_VOID* HI_MPI_SYS_MmapCache(HI_U64 u64PhyAddr, HI_U32 u32Size);
//参数1:需映射的内存单元起始地址。参数2:映射的字节数。

参数1,即图像帧结构中的物理地址。
参数2,即帧图像大小。根据通道属性为YUVsp420,所以这里的Size大小为Stride * Height * 3 / 2。
此接口函数返回的是一个物理地址,这里即Y分量的首地址。可得:

//Y分量的地址   pUserPageAddr为上述接口函数返回值
pVBufVirt_Y = pUserPageAddr;
//UV分量的地址 Y分量之后才开始UV分量
pVBufVirt_C = pVBufVirt_Y + stride * height;

在得到这些地址之后,我们就可以对图像格式进行转换。具体的转换后续再进行详细记录。
具体方式有:
1.通过Libyuv库进行转换,SP420->P420->YUY2。
2.通过NEON指令转换。 NV21->YUY2。
等。

//V1.0
2019.12.06
1.总结了YUV采样格式、YUV存储方式,已经基于海思平台的简单操作。

像素格式之YUV(基于海思Hisi35xx平台)相关推荐

  1. 基于海思开发板的屏幕截图程序(二)

    针对 基于海思开发板的屏幕截图程序(一)作了改进,上篇文章的截图结果不正确的原因是:我公司的开发板上fb0中设置的图片格式为ARGB1555,但是我将它作为RGB565来使用,导致转换出来的图片数据不 ...

  2. yolo 海思嵌入式_一、基于海思芯片:从算法到移植 darknet框架下训练yolov3

    今天是2020年1月25号,大年初一,万万没想到,这个本来狂舞躁动的时刻,敝人会安逸的坐在家里写博客,这场肺炎带给我们的应该是深刻反思.边缘计算如日中天,或者说把深度学习落地,搞到移动端解决是一个大趋 ...

  3. 对于抖音关闭OBS的解决方案之基于海思方案的NDI编码器和解码器使用方法

    对于抖音关闭OBS终于有个临时的解决方案了,但这个方案还是要求主播有权限使用电脑开播,现在开始介绍NDI接入方法,如果还是有不明白的请留言. 参考连接: https://blog.csdn.net/w ...

  4. 基于海思方案的NDI编码器和解码器使用方法

    本文镜像:https://www.linkpi.cn/archives/356 本文链接:https://blog.csdn.net/weixin_45326556/article/details/1 ...

  5. 《基于海思35xx nnie引擎进行经典目标检测算法模型推理》视频课程介绍

    前言 沉寂两个月,终于将新的视频课程<<基于海思35xx nnie引擎进行经典目标检测算法模型推理>>(其链接为https://edu.csdn.net/course/deta ...

  6. 基于海思AI芯片的智能视频分析边缘网关

    1 产品简介 基于海思高性能AI平台的智能视频分析边缘网关主要实现从网络摄像头及NVR采集的多路高清视频流进行实时分析功能,产品内置高性能视频处理单元与神经网络加速运算单元,加上基于深度学习框架的AI ...

  7. 四、基于海思芯片:从算法到移植 生成海思wk文件并进行成果展示

    一.基于海思芯片:从算法到移植  darknet框架下训练yolov3 二.基于海思芯片:从算法到移植   darknet框架下yolov3转为caffe框架下 三.基于海思芯片:从算法到移植   c ...

  8. 【数字视频编码基础学习】像素格式RGB/YUV

    一.RGB概述 R:red,G:Green,B:Blue,即红绿蓝--色光三原色(加法三原色),通过不同比例相加,可产生多种颜色. 补:除色光三原色外,还有另一种颜料三原色(减法三原色),即看到的印刷 ...

  9. 海思linux中编译,基于海思开发环境,交叉编译,安装tslib库

    环境:Ubuntu-18.04 64位 交叉编译器:arm-hisiv600-linux tslib版本:tslib-1.4 一.安装交叉编译器 [注意]本文中使用 Hi3531D 的 V600 编译 ...

最新文章

  1. 人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译
  2. Java Graphics类的绘图方法
  3. 爬虫侵入计算机系统,【探讨】利用“爬虫技术”获取数据行为的刑事考量 ——以一起非法获取计算机信息系统数据案为例...
  4. 中有冒号 文件路径_用Matlab脚本文件实现Excel文件的合并
  5. V4L2学习(三)框架分析
  6. springMVC设置静态资源过滤器,过滤js、css、images等静态资源
  7. js table 生成序号_CSS Counter 以及 CSS content 内容生成技术的实用价值
  8. Linux之安装虚拟机/虚拟操作系统[VisualBox]
  9. 1. paip.discuz X2.5 积分(金钱)功能API总结
  10. linux下解除端口防火墙,Linux下防火墙配置、端口的开启和关闭
  11. 软件测试之Web测试流程和方法
  12. 用tinypng压缩图片
  13. 从年薪1万到年薪100万的日子
  14. 计算机械功的公式,机械功的计算
  15. 反编译jad的命令使用
  16. WiFi信号覆盖面积小?如何扩大Wifi信号覆盖范围?
  17. ajax 传对象数组到后台
  18. 如何了解客户的购买价值观 (销售中的心理学)
  19. SURF网格化特征点提取算法流程(一)
  20. NAT技术的简要概述

热门文章

  1. PCA(Principal Component Analysis 主成分分析)原理及MATLAB实现
  2. BUIUCTF-镜子里面的世界
  3. IOTA架构下的数据采集
  4. Centos下堡垒机Jumpserver V3.0环境部署
  5. 算法模型部署上线工程实践
  6. org.springframework.web.bind.MissingRequestHeaderException: Missing request header ‘token‘ for metho
  7. 八大名茶,铁观音为首
  8. SQL34 批量插入数据
  9. base64存储图片/显示图片
  10. node爬虫(入门)