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表空间文件。 表空间文件 默认表空间文件(…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
