YUV实践记录
文章目录
- YUV基础介绍:
- 不同采样YUV格式的区别
- 为什么要使用YUV格式呢?
- YUV的存储方式
- Android中的YUV_420_888
- 附录:
YUV基础介绍:
YUV在做手机图像或者视频处理的时候会经常用到的一个格式,用此文来记录YUV相关介绍,让项目中用到YUV不再对这个概念懵逼。
YUV这个名名词是什么意思的:参考维基百科:
The YUV model defines one luminance component (Y) meaning physical linear-space brightness, and two chrominance components, called U (blue projection) and V (red projection) respectively. It can be used to convert to and from the RGB model, and with different color spaces.
链接:
外链YUV维基百科介绍:https://en.wikipedia.org/wiki/YUV
国内可访问:https://encyclopedia.thefreedictionary.com/YUV
YUV 作为一种图像编码格式,Y表示亮度分量,UV表示色度信息:U表示蓝色部分投影,V表示红色部分投影。
不同采样YUV格式的区别
YUV在日常使用的时候会有很多格式,YUV420,YUV444,YUV422,NV21,NV12,这些格式的区别的什么呢?
下图是一张采样图:
参考:https://en.wikipedia.org/wiki/Chroma_subsampling
上面的图像中展示了不同的数字所表示的采样格式的不同:
-
YUV4444:每一个Y分量对应一个像素,每个Y分别对应单独的U和V,因此YUV444每个像素占用的图片大小为 8bit+8bit+8bit=24bit(3byte)。
-
YUV422:水平方向上每两个Y分量对应一对UV分量,则每个像素占用的大小就是8bit+4bit+4bit=16bit。(1byte+1/2byte+1/2byte=2byte)
-
YUV420:420在水平和垂直方向都进行了采样,每一个Y分量对应1/4哥UV分量,因此表示一个像素需要的大小为1byte+1/4byte+1/4byte=1.5byte
参考链接:https://en.wikipedia.org/wiki/YUV#Y%E2%80%B2UV420p_(and_Y%E2%80%B2V12_or_YV12)_to_RGB888_conversion -
I420格式:
I420是一种yuv420采样的数据格式,存储的时候按照y、u、v的顺序依次存储
YUV 4:2:0 (I420/J420/YV12)
I420
It has the luma “luminance” plane Y first, then the U chroma plane and last the V chroma plane.
The two chroma planes (blue and red projections) are sub-sampled in both the horizontal and vertical dimensions by a factor of 2. That is to say, for a 2×2 square of pixels, there are 4 Y samples but only 1 U sample and 1 V sample.
This format requires 4×8+8+8=48 bits per 4 pixels, so its depth is 12 bits per pixel. -
YV12格式:
YV12格式也是一种YUV420采样格式使用plane格式存储,只不过在存储时按照Y,V,U顺序存储。
YV12
YV12 is exactly like I420, but the order of the U and V planes is reversed. In the name, “YV” refers to the plane order: Y, then V (then U). “12” refers to the pixel depth: 12-bits per pixel as for I420.
参考:https://wiki.videolan.org/YUV
- NV21和NV12格式:
NV21和NV12是YUV420编码方式的一种,采样使用4:2:0的方式进行采样,只不过在存储的时候使用UV交错存储,是一种YUV420sp格式。只不过在UV分量的保存上顺序不同
NV21:存储顺序是先存Y,再VU交替存储,NV21存储顺序是先存Y值,再VU交替存储:YYYYVUVUVU
NV12:存储顺序是先存Y值,再UV交替存储:YYYYUVUVUV,以 4 X 4 图片为例子,占用内存为 4 X 4 X 3 / 2 = 24 个字节
参考:https://blog.csdn.net/byhook/article/details/84037338
为什么要使用YUV格式呢?
YUV相比于RGB的优势
数据量减少:RGB一个像素需要3byte,RGB每一个数据都需要1byte(8bit),一张长width,高height的图片,需要的空间为widthheight3byte,而对于YUV420格式,所需要的空间就为widthheight1.5byte,占用空间减少了一半。
向前兼容黑白电视:YUV中的Y分量可以兼容之前不支持彩色画面的设备。
不足:
采样带来图像画质的降低
YUV的存储方式
- Planar (平面格式):y, u, v使用三个平面存储 ,例如:第0个平面表示y分量数据,第1个平面表示u分量数据,第2个平面表示v分量数据,这种存储名称以p结尾,例如:420p。
- Semi-Planar:Y分量在单独的平面中存放,uv分量在一个平面中交错存放,这种存储名称以sp结尾,420sp。
- Packed: YUV数3个分量全部交错存储。Y读取他周围的UV分量数据,以YUY2为例,存储方式为:Y0U0Y1V0 Y2U1Y3V1。
Android中的YUV_420_888
This format is a generic YCbCr format, capable of describing any 4:2:0 chroma-subsampled planar or semiplanar buffer (but not fully interleaved), with 8 bits per color sample.
上面的格式是一种通用的YU(cb)V(cr)格式,可以用来表示任何420采样的平面或者半平面数据,但是不能用来表示YUV都是交错(不支持Packed格式的数据)。
这里如何区分是平面还是半平面的数据的呢,可以使用plane属性中的getPixelStride去区分,1表示是plane因为相同类型数据存储是相邻的,2的话就表示相同数据会间隔存储,表示存储是交错的,即sp格式。
plane #0 is always Y, plane #1 is always U (Cb), and plane #2 is always V (Cr).
0平面表示Y平面,1平面表示U平面,2平面表示V平面。
The Y-plane is guaranteed not to be interleaved with the U/V planes (in particular, pixel stride is always 1
Y平面不会和UV平面交错,同时Y平面的Pixel stride总是1。
The U/V planes are guaranteed to have the same row stride and pixel stride (in particular, uPlane.getRowStride() == vPlane.getRowStride() and uPlane.getPixelStride() == vPlane.getPixelStride(); ).
同时U/V平面的rowstride和pixelstride相同。
名词解释:
- pixelStride:表示同一个颜色分量之间的步长。取值1的话那同一个颜色分量的index为0、1、2、3、4、…,取值为2的话那同一个颜色分量的index为0、2、4、6。
- rowStride:表示该平面每行数据的宽度。(byte为单位)
在ARCore和华为ArEngine获取相机数据的时候,返回的数据格式就是上面的YUV_420_888格式。
Android中如果pixelStride的size时2,那么格式就是YUV420SP,420sp中获取到的数据uv分量交替存储。
附录:
获取到的三个平面plane[0]+plane[1]就是NV12,plane[0]+plane[2]就是NV21:
https://blog.csdn.net/lbknxy/article/details/54633008
根据pixelstride区分存储方式,解析uv数据:
https://blog.csdn.net/weekend_y45/article/details/125079916
相关文章:

YUV实践记录
文章目录YUV基础介绍:不同采样YUV格式的区别为什么要使用YUV格式呢?YUV的存储方式Android中的YUV_420_888附录:YUV基础介绍: YUV在做手机图像或者视频处理的时候会经常用到的一个格式,用此文来记录YUV相关介绍…...

【题解】百度2020校招Web前端工程师笔试卷(第一批):单选题、多选题
题目来源 若有错误请指正! 单选 1 分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号,从0开始,若某一计算机主存按字节编址,逻辑地址和物理地址都是32位,页表项大小为4字节,若…...
探索云原生技术之容器编排引擎-kubeadm安装kubernetes1.21.10(新版:针对高版本内核)
❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…...
2023广西自治区职业技能大赛“网络安全” 项目比赛任务书
2023广西自治区职业技能大赛“网络安全” 项目比赛任务书2023广西自治区职业技能大赛“网络安全” 项目比赛任务书A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux)A-2:Nginx安全策略&a…...

Reactor模式
Reactor是一种设计模式,可以用于构建高并发的网络服务器。 Reactor模式的好处在于:可以在一个或多个reactor线程使用多路复用技术去管理所有网络连接连接建立、IO请求,保证工作线程不被IO阻塞。 前置知识:IO多路复用技术 1. 传统网…...

Git图解-IDEA中的Git操作
目录 一、配置Idea 二、项目克隆 三、文件状态识别 四、Git操作 4.1 git add--添加暂存区 4.2 git commit--提交本地仓库 4.3 git push--推送远程仓库 4.4 git pull--更新本地仓库 五、完整开发流程 5.1 步骤1:克隆项目 5.2 步骤2:创建自己开发…...

在一个web应用中应该如何完成资源的跳转
在一个web应用中通过两种方式,可以完成资源的跳转: 第一种方式:请求转发 第二种方式:重定向 转发和重定向的区别: 代码上的区别: 请求转发 // 获取请求转发器对象 RequestDispatcher dispatcher request.…...
前缀和部分题目
前缀和 前缀和指数组的前 N项之和,是个比较基础的算法 例题 面试题 17.05. 字母与数字 给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。 返回该子数组,若存在多个最长子数组,返回左…...

三天吃透MySQL面试八股文
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
Giving You A guide to learning any topic faster than 95% of people
A guide to learning any topic faster than 95% of people: Richard Feynman was a physician who won the Nobel Prize in 1965. But he became known for his great lectures. Why? He was able to explain complex concepts in simple terms with these 4 steps: 1 • E…...
(七十七)大白话MySQL是如何根据成本优化选择执行计划的?(中)
上次我们讲完了全表扫描的成本计算方法,相信大家应该都理解了,其实还是比较简单的,今天我们来讲一下索引的成本计算方法,因为除了全表扫描之外,还可能多个索引都可以使用,但是当然同时一般只能用一个索引&a…...

原来CSS 也可以节流啊
Ⅰ、前言 「节流」 是为了减少请求的触发频率,不让用户点的太快,达到节省资源的目的 ;通常 我们采用 JS 的 定时器 setTimeout ,来控制点击多少秒才能在触发;其实 通过 CSS 也能达到 「节流」 的目的,下面…...

UE官方教程笔记03-功能、术语、操作简介
对官方教程视频[官方培训]03-UE功能、术语、操作简介 | 徐良安 Epic的笔记这一部分基本都是走马观花的简单介绍功能世界创建建模Mesh editingtool是一个全新的建模工具,具备大多数的主流建模软件的核心功能HOUDINI ENGINE FOR UNREALHoudini编辑器,可以用…...

BN,LN,IN,GN的理解和用法
绿色区域表示将该区域作用域(四种方法都贯穿了w,h维度),即将该区域数值进行归一化,变为均值为0,标准差为1。BN的作用区域时N,W,H,表示一个batch数据的每一个通道均值为0,标准差为1;LN则是让每个数据的所有channel的均值…...

Linux:epoll模式web服务器代码,代码debug
源码: https://blog.csdn.net/weixin_44718794/article/details/107206136 修改的地方: 修改后代码: #include <stdio.h> #include <unistd.h> #include <stdlib.h> //#include “epoll_server.h” #ifndef _EPOLL_SER…...

SpringSecurity学习(四)密码加密、RememberMe记住我
文章目录密码加密一、简介密码为什么要加密常见的加密解决方案PasswordEncoder详解DelegatingPasswordEncoder二、自定义加密方式1. 使用灵活的密码加密方案(BCryptPasswordEncoder)加密验证(推荐)需要在密码前指定加密类型{bcryp…...

vue专项练习
一、循环实现一个列表的展示及删除功能 1.1 列表展示 1、背景: 完成一个这样的列表展示。使用v-for 循环功能 id接口名称测试人员项目名项目ID描述信息创建时间用例数1首页喵酱发财项目a1case的描述信息2019/11/6 14:50:30102个人中心张三发财项目a1case的描述信…...
【笔试题】百度+美团
发工资 链接:https://www.nowcoder.com/questionTerminal/e47cffeef25d43e3b16c11c9b28ac7e8 来源:牛客网 小度新聘请了一名员工牛牛, 每个月小度需要给牛牛至少发放m元工资(给牛牛发放的工资可以等于m元或者大于m元, 不能低于m)。 小度有一些钞票资金…...

【8.索引篇】
索引分类 索引和数据就是位于存储引擎中: 按「数据结构」分类:Btree索引、Hash索引、Full-text索引。按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。按「字段特性」分类&#…...

MySQL InnoDB存储引擎锁与事务实现原理解析(未完成)
InnoDB MySQL存储引擎是基于表的,也就是说每张表可以选择不同的存储引擎。 InnoDB存储引擎的表是索引组织的,也就是数据即索引。 存储引擎文件 InnoDB引擎会包含RedoLog重做日志文件和TableSpace表空间文件。 表空间文件 默认表空间文件(…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...