Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >10v转16v_nv12和nv21区别

10v转16v_nv12和nv21区别

作者头像
全栈程序员站长
发布于 2022-11-08 08:33:17
发布于 2022-11-08 08:33:17
41302
代码可运行
举报
运行总次数:2
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

摘要

关于像素格式转换,搜到的帖子基本是NV16转RGB24 或 NV12转RGB24,对于NV16转NV12并没太多资料,因此我打算参照这两个像素格式的结构,实现这个转换接口。

NV16像素格式介绍

NV16可以理解为yuyv像素格式的变种,属于YUV422SP类型。整帧图像的大小为 Width * Height * 2。其像素格式如下:

  • start + 00: Y00 Y01 Y02 Y03
  • start + 04: Y10 Y11 Y12 Y13
  • start + 08: Y20 Y21 Y22 Y23
  • start + 12: Y30 Y31 Y32 Y33
  • start + 16: Cb00 Cr00 Cb01 Cr01
  • start + 20: Cb10 Cr10 Cb11 Cr11
  • start + 24: Cb20 Cr20 Cb21 Cr21
  • start + 28: Cb30 Cr30 Cb31 Cr31

NV12像素格式介绍

NV12则属于YUV420SP类型,整帧图像的大小为 Width * Height * 3 / 2。其像素格式如下:

  • start + 00: Y00 Y01 Y02 Y03
  • start + 04: Y10 Y11 Y12 Y13
  • start + 08: Y20 Y21 Y22 Y23
  • start + 12: Y30 Y31 Y32 Y33
  • start + 16: Ub00 Ur00 Ub01 Ur01
  • start + 20: Ub10 Ur10 Ub11 Ur11

转换规则介绍

  • Y数据直接拷贝。
  • NV12的 Ubxx取值NV16奇数行的Cbxx
  • NV12的 Urxx取值NV16偶数行的Crxx

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NV16              NV12
Cb00 Cb01  ----> Ub00 Ub01
Cr10 Cr11  ----> Vr00 Vr01
Cb20 Cb21  ----> Ub10 Ub11
Cr30 Cr31  ----> Vr10 Vr11

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
/** * 功能:nv16像素格式转换为nv12像素格式 * 参数介绍: * nv16_buff:NV16格式一帧数据,大小为 w * h * 2,作为函数输入。 * nv12_buff:NV12格式的一帧数据,大小为 w * h * 3 / 2,作为函数输出。 * w:图像的宽度。 * h:图像高度。 */
int pixel_format_nv16_to_nv12(char *nv16_buff, char *nv12_buff, int w, int h)
{ 

unsigned char *nv16_y = NULL;
unsigned char *nv16_uv = NULL;
unsigned char *nv12_y = NULL;
unsigned char *nv12_u = NULL;
unsigned char *nv12_v = NULL;
int i, j, offset;
if (!nv16_buff || !nv12_buff || ((w*h) <= 0)) { 

printf("ERROR: %s input args invalid!\n", __func__);
return -EINVAL;
}
/* get the right point */
nv16_y = (unsigned char *)nv16_buff;
nv16_uv = (unsigned char *)nv16_buff + w * h;
nv12_y = (unsigned char *)nv12_buff;
nv12_u = (unsigned char *)nv12_buff + w * h;
nv12_v = nv12_u + 1;
/* copy y dates directly */
memcpy(nv12_y, nv16_y, w * h);
/* get nv12_uv dates from nv16_uv * * >>>> nv16 pix formate: * start + 0: Y'00 Y'01 Y'02 Y'03 * start + 4: Y'10 Y'11 Y'12 Y'13 * start + 8: Y'20 Y'21 Y'22 Y'23 * start + 12: Y'30 Y'31 Y'32 Y'33 * start + 16: Cb00 Cr00 Cb01 Cr01 * start + 20: Cb10 Cr10 Cb11 Cr11 * start + 24: Cb20 Cr20 Cb21 Cr21 * start + 28: Cb30 Cr30 Cb31 Cr31 * * >>>> nv12 pix formate: * start + 0: Y'00 Y'01 Y'02 Y'03 * start + 4: Y'10 Y'11 Y'12 Y'13 * start + 8: Y'20 Y'21 Y'22 Y'23 * start + 12: Y'30 Y'31 Y'32 Y'33 * start + 16: Ub00 Vr00 * start + 18: Ub01 Vr01 * start + 20: Ub10 Vr10 * start + 22: Ub11 Vr11 * * nv16的uv分量与 nv12的uv分量对于关系: * 偶数行取Cb值,奇数行取Cr值 * Cb00 Cb01 ----> Ub00 Ub01 * Cr10 Cr11 ----> Vr00 Vr01 * Cb20 Cb21 ----> Ub10 Ub11 * Cr30 Cr31 ----> Vr10 Vr11 */
/* 奇数行取Cb */
offset = 0;
for (i = 0; i < h; i+=2) { 

offset = i * w;
for (j = 0; j < w; j+=2) { 

*nv12_u = *(nv16_uv + offset + j);
nv12_u += 2;
}
}
/* 偶数行取Cr */
offset = 0;
for (i = 1; i < h; i+=2) { 

offset = i * w;
for (j = 1; j < w; j+=2) { 

*nv12_v = *(nv16_uv + offset + j);
nv12_v += 2;
}
}
return 0;
}

工程下载地址

工程地址:https://download.csdn.net/download/lyy901135/11458140

完整工程,包含main函数,以及测试输入的nv16图片,只需执行make编译后即可运行。

运行命令:./nv16_to_nv12 test.nv16 test.nv12

查看输出图片(nv12):ffplay -f rawvideo -video_size 1920x1080 -pixel_format nv12 test.nv12 由图可见,转换后色度都是正确的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月24日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【分享】MPSoC VCU Ctrl-SW 2020.2 输出NV12的YUV文件
Xilinx提供超低延时编解码方案,并提供了全套软件。MPSoC Video Codec Unit提供了详细说明。其中的底层应用软件是VCU Control-Software(Ctrl-SW)。
hankfu
2021/05/18
6230
【分享】MPSoC VCU Ctrl-SW 2020.2 输出NV12的YUV文件
图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
YUV模型是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间,常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等,其中比较常见的YUV420分为两种:YUV420P和YUV420SP。
全栈程序员站长
2022/09/13
3.4K0
图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
NV21、NV12、YV12、RGB565、YUV等颜色编码格式区别和接口设计探讨
NV21、NV12、YV12、RGB565、YUV分别是不同的颜色编码格式,这些颜色编码格式各有特点,适用于不同的应用场景。选择合适的颜色编码格式取决于具体的需求和环境:
音视频牛哥
2023/09/01
1.2K0
NV21、NV12、YV12、RGB565、YUV等颜色编码格式区别和接口设计探讨
一文掌握 YUV 图像的基本处理
YUV 是一种色彩编码模型,也叫做 YCbCr,其中 “Y” 表示明亮度(Luminance),“U” 和 “V” 分别表示色度(Chrominance)和浓度(Chroma)。
字节流动
2020/06/01
3.3K0
详解YUV数据格式
我们在讲 FFmpeg 系列的时候,有提到 YUV 的。其中包括YUV播放器、简单的YUV格式介绍。
233333
2019/08/02
2K0
【Android RTMP】Android Camera 视频数据采集预览 ( NV21 图像格式 | I420 图像格式 | NV21 与 I420 格式对比 | NV21 转 I420 算法 )
① Camera 采集的数据 : 上面讲解了 Camera 摄像头采集图像数据之后 , 会回调 PreviewCallback 接口的 onPreviewFrame 方法 , onPreviewFrame 方法的 byte[] data 参数 , 就是 Camera 采集的图像数据 ;
韩曙亮
2023/03/27
1K0
图像基础知识之YUV
YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度与浓度(Chrominance、Chroma)
全栈程序员站长
2022/09/07
1.3K0
图像基础知识之YUV
10bit YUV(P010)的存储结构和处理
前面讨论关于 YUV 图像 NV21、YUYV 等格式的处理,都是 8 bit YUV 格式,即每个 Y、U、V 分量分别占用 8 个 bit (一个字节)。
字节流动
2021/10/20
8.2K0
10bit YUV(P010)的存储结构和处理
NV12与YV12,YUV的主要格式「建议收藏」
YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度与浓度(Chrominance、Chroma)
全栈程序员站长
2022/11/08
14.5K0
NV12与YV12,YUV的主要格式「建议收藏」
【音视频原理】图像相关概念 ⑤ ( YUV 数据存储 | I444 格式说明 | I422 格式说明 | I420 格式说明 | NV12 格式说明 | NV21 格式说明 )
YUV 4:4:4 采样格式 , Y 亮度分量 与 UV 色度分量 的比例是 1:1 ;
韩曙亮
2024/01/21
1.5K0
【音视频原理】图像相关概念 ⑤ ( YUV 数据存储 | I444 格式说明 | I422 格式说明 | I420 格式说明 | NV12 格式说明 | NV21 格式说明 )
使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
最近,有位读者大人在后台反馈:在参加一场面试的时候,面试官要求他用 shader 实现图像格式 RGB 转 YUV ,他听了之后一脸懵,然后悻悻地对面试官说,他只用 shader 做过 YUV 转 RGB,不知道 RGB 转 YUV 是个什么思路。
字节流动
2021/05/27
7.9K0
使用 OpenGL 实现 RGB 到 YUV 的图像格式转换
YUV文件格式[通俗易懂]
转:https://blog.csdn.net/armwind/article/details/52190123,文章不错特转载过来备忘
全栈程序员站长
2022/09/13
2.5K0
YUV文件格式[通俗易懂]
音视频知识体系(基础篇3)----图像颜色空间
我们从视频的信号表示方法开始讲起,逐步深入到视频压缩编码的原理。我们主要从下面几个要点来讲解或者加深记忆。
jerrypxiao
2021/02/04
2K0
nv12转yuv420_百转
YU12格式也叫I420格式,是YUV420p其中的一种,NV12是YUV420sp的一种。YU12和NV21中YUV数据的排列方式为: YU12:YYYYYYYY UU VV NV12:YYYYYYYY UV UV 针对数据的排列结构,本文将NV12转为YU12。
全栈程序员站长
2022/11/08
9550
nv12转yuv420_百转
YUV 格式详解-史上最全
音视频领域的人恐怕没有人不知道 YUV,但是 YUV 本身有好多种变种,名称也各种各样,本文就位大家总结一下YUV 的各种格式。
Redknot
2021/01/25
2.9K1
YUV 格式详解-史上最全
君正T31开发应用12:YUV和RAW数据
是没有办法直接使用的,还要在host端做ISP,做色彩纠正,增强,HDR,插值成RGB,转成YUV,最后再使用。
春江花月夜
2023/06/22
1.4K0
君正T31开发应用12:YUV和RAW数据
ps如何去水印不留痕迹_水印原理
图像叠加与音频叠加(混音)不同,人耳可以同时听到两种声音,因此混音时需要将两种信号都保留;但视频不同,图像一旦叠加,那么叠加区域人眼就只能看到最上层的图像。本文仅阐述对原始图像数据做修改的叠加方式,不涉及多个plane实现显示级别的图像叠加的知识。因此本文所述的图像叠加基本原理就是:顶层图像的像素直接替换掉底层图像的像素,从而新的图像会显示出叠加效果。
全栈程序员站长
2022/11/08
1.4K0
ps如何去水印不留痕迹_水印原理
Android Bitmap转I420的坑,以及图文详解YUV420数据格式
今天Android要把Bitmap里的数据转成I420,用的YUV库,但是总有色差。查了好久,最终发现
望天
2020/03/11
3.7K0
SkeyeRTSPLive高效转码之SkeyeVideoEncoder高效硬件编码解决方案(附源码)(2)
在之前的《SkeyeRTSPLive高效转码之SkeyeVideoDecoder高效解码》系列文章中我们已经将视频解码成了原始图像数据(YUV/RGB),然后根据不同的转码需求进行编码。如视频分辨率缩放,调整码率,多码率输出等;为了解决转码过程中编码高分辨率高质量或者高压缩率(如H265)耗时的问题,我们采用Nvidia硬件驱动编码器进行编码,以追求最高效率的转码和最低的推送延迟。
Openskeye
2023/04/23
4770
Sony RX0M2(杂记)
我最近兼职赚了点小钱,就想买个玩具。我年前有点想买佳能,为了ML的相机固件,我把目光聚焦到5D2,虽然1k8可以买到一个相机,但是是单机身而已,而且说实话是这个机器实在是太老了。。。最气的是,我买相机用来干什么?肯定没人找我拍照的,我就是未来折腾而已。后面就把目光聚集到Sony的阿尔法1代,后面还是很尴尬,因为,我这个钱就是可以买机身,还是很麻烦,而且我是一直想使用Sony的SDK。所以这个选项也就打消了,直到看到RX0M2的时候,眼前一亮,小小机身,塞进这么多的功能。重点是USB摄像头,SDK控制的功能,我真的爱了,一直就想买个测试机。看了一些缺点也很明显,不过作为一名工程师,岂是可以难的住我的。
云深无际
2022/03/07
1.3K0
Sony RX0M2(杂记)
推荐阅读
相关推荐
【分享】MPSoC VCU Ctrl-SW 2020.2 输出NV12的YUV文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档