【nv12 格式转换】不同图像数据格式之间转换代码实操

news2024/11/15 3:44:36

文章目录

  • 1 问题先行
  • 2 nv12介绍
    • 2.1 YUV格式
    • 2.2 NV12排布
  • 3 不同数据格式之间转换实操
  • 4 参考链接

1 问题先行

  1. nv12是什么格式?和常见的rgb/bgr有什么关系吗?他们之间能互相转换吗?
  2. 如何读取一张图片,然后把图片转换成nv12格式?有代码嘛?
  3. 部署时,为何要用nv12数据格式作为输入?rgb不行吗?

2 nv12介绍

2.1 YUV格式

YUV格式主要用于优化彩色视频信号的传输。
YUV分为三个分量:Y表示明亮度,也就是灰度值;U和V表示色度,用于描述影像色彩及饱和度,指定像素的颜色。

2.2 NV12排布

NV12图像格式属于YUV颜色空间中的YUV420SP格式,每四个Y分量共用一组U分量和V分量,Y连续排序,U与V交叉排序。

排列方式如下:
在这里插入图片描述

3 不同数据格式之间转换实操

读取一张图片,从bgr转成nv12,再从nv12转成yuv44,具体内容看看代码和输出即可。

import cv2 
import numpy as np 
from PIL import Image 

# -------------------------------------------------------#
# 注意: image.shape = (h, w, c)
# nv12数据与YUV_I420的uv分量排列方式不同,具体可参考本文第2章节描述
# -------------------------------------------------------#
def bgr2nv12(image): 
    image = image.astype(np.uint8) 
    height, width = image.shape[0], image.shape[1] 
    yuv420p = cv2.cvtColor(image, cv2.COLOR_BGR2YUV_I420).reshape((height * width * 3 // 2, )) 
    y = yuv420p[:height * width] 
    uv_planar = yuv420p[height * width:].reshape((2, height * width // 4)) 
    uv_packed = uv_planar.transpose((1, 0)).reshape((height * width // 2, )) 
    nv12 = np.zeros_like(yuv420p) 
    nv12[:height * width] = y 
    nv12[height * width:] = uv_packed 
    return nv12

# nv12转yuv444
def nv12Toyuv444(nv12, target_size):
    height = target_size[0] 
    width = target_size[1] 
    nv12_data = nv12.flatten() 
    yuv444 = np.empty([height, width, 3], dtype=np.uint8) 
    yuv444[:, :, 0] = nv12_data[:width * height].reshape(height, width) 
    u = nv12_data[width * height::2].reshape(height // 2, width // 2) 
    yuv444[:, :, 1] = Image.fromarray(u).resize((width, height),resample=0) 
    v = nv12_data[width * height + 1::2].reshape(height // 2, width // 2) 
    yuv444[:, :, 2] = Image.fromarray(v).resize((width, height),resample=0) 
    return yuv444


if __name__=='__main__': 
    img = cv2.imread("./zebra_cls.jpg")     # bgr  hwc
    print("cv2读图shape:", img.shape)

    # 直接resize,其它缩放图片方式个性化使用 
    img = cv2.resize(img,(672,672))         # bgr  hwc
    print("resize后的图片shape:", img.shape)

    # 将bgr的数据格式转换成nv12的数据格式
    # 注意上方转换函数写的时候,输入img需要是(h, w, c)的layout排布
    nv12 = bgr2nv12(img)
    # 677376=672x672x3/2,这儿为什么除以2,参考本文第1章理解理解~
    print("nv12的shape:", nv12.shape)
    
    # 将nv12的数据保存下来供给模型,作为真实输入
    nv12.tofile("nv12_input_data.bin")
    
    # nv12转yuv444
    img = nv12Toyuv444(nv12, (672,672))
    print("yuv444的shape:", img.shape)

    # 变换数据排布layout
    img = img.transpose(2,0,1) 
    print("yuv444 transpose之后的shape:", img.shape)

    # 增加一个N维度
    img = img[np.newaxis,:,:,:] 
    print("增加一个N维度的shape:",img.shape)

输出

cv2读图shape: (376, 376, 3)
resize后的图片shape: (672, 672, 3)
nv12的shape: (677376,)# 677376=672x672x3/2,为什么除以2,参考本文第2章理解理解~
yuv444的shape: (672, 672, 3)
yuv444 transpose之后的shape: (3, 672, 672)
增加一个N维度的shape: (1, 3, 672, 672)

:部分代码有参考地平线OE包中的内容。

之所以用nv12作为部署时的数据输入,是因为其数据量是rgb/bgr等格式的一半,减少模型load输入数据的时间。

4 参考链接

1. https://developer.horizon.ai/forumDetail/118364000835765839

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

liunx Reids哨兵模式+1主三从部署6.2.x

1.下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz2.解压 tar xzf redis-6.2.6.tar.gz 3.安装redis cd redis-6.2.6make && make install redis安装异常 安装gcc yum install gcc 检查gcc环境是否安装好rpm -qa|grep gcc 最后在安装redis m…

情人节适合送礼的数码好物有哪些?心意满满的数码好物清单

2023的情人节就快到了,各大数码品牌都已经摩拳擦掌。那么,情人节适合送礼的数码好物有哪些?下面,我来给大家推荐几款心意满满的数码好物,一起来看看吧。 一、蓝牙耳机 推荐产品:南卡小音舱 推荐理由&…

u盘为什么被写保护?u盘数据写保护如何恢复

u盘作为目前主流的数据存储辅助工具,能够存放各种重要数据。虽然u盘体积小巧使用方便,但是使用环节中也会存在各类问题,例如提示u盘写保护的情况。那么出现这种情况的原因是什么,如何解决u盘写保护问题以及写保护的u盘如何恢复数据…

Spring Cloud Gateway断言及过滤器使用

目录 1. 引入Spring Cloud Gateway 2. 核心概念 3. 工作原理 4. 配置路由断言工厂和网关过滤器工厂 5. 路由断言工厂 ​5.1 断言某个时间之后 5.2 断言某个时间之前 5.3 断言某个时间之间 5.4 根据cookie值断言 5.5 根据请求的标头断言 5.6 根据主机名来断言 5.7 根…

Java集合常见面试题(五)

Map 接口 ConcurrentHashMap 的实现原理 JDK 1.7 JDK1.7中的ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成,即ConcurrentHashMap 把哈希桶切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。 其…

贴息贷款政策下,高校建立大数据实验室新思路

高校实验室建设总目标是搭建一站式教学服务平台,一站式教学服务平台概念是在深刻理解高校学科建设及存在的若干问题上提出。围绕着学科建设的各个方面,从专业开设、课程设置、师资培养、教学资源、实验环境、学生实训实习及就业创业等环节,提…

Hive UDF开发

Hive中,除了提供丰富的内置函数(见Hive函数大全–完整版(二))之外,还允许用户使用Java开发自定义的UDF函数。 开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承or…

windows系统下安装伪分布式Hadoop3.x

1.下载 1.1下载Hadoop3.1.3 官网地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/ 选择hadoop-3.1.3.tar.gz 1.2下载工具集winutils 由于Hadoop不直接支持Windows系统,因此需要使用工具集winutils进行支持。 下载网址:…

can‘t be used as a mixin because it extends a class other than ‘Object‘.

程序员如果敲一会就停半天,抱着一杯茶,表情拧巴,那才是在编程 Flutter 项目开发指导 从基础入门到精通使用目录 前言 - 基础关键字 class:声明一个类,提供具体的成员变量和方法实现。abstract class:声明一…

27.日志技术、XML

目录 一.日志技术 1.1 什么是日志 1.2 目前记录日志的方案 1.3 日志技术的优势 1.4 日志技术体系 1.5 Logback框架 1.5.1 下载地址 1.5.2 模块组成 1.5.3 Logback的使用 二.XML 2.1 XML概述 2.2 XML的特点 2.3 XML文件的使用场景 2.4 XMl文件的创建 2.5 XML的语法…

江瀚新材登陆上交所主板:募资约24亿元,甘书官父子为实际控制人

1月31日,湖北江瀚新材料股份有限公司(下称“江瀚新材”,SH:603281)在上海证券交易所主板上市。本次上市,江瀚新材公开发行股票66,666,667股,发行价格为35.59元/股,发行市盈率为14.80倍。 按发行…

更高性能表现、更低资源占用,高精度计算数据类型 DecimalV3 揭秘

数值运算是数据库中十分常见的需求,例如计算数量、重量、价格等,为了适应多样化运算场景,数据库系统通常支持精准的数字类型和近似的数字类型,当我们需要精确地表示小数并计算小数时,通常会考虑使用 Decimal 数据类型。…

低代码编程核心技术概念

从技术概念来讲,低代码编程跟通用编程是完全一致的。要利用好低代码编程工具,至少要掌握下面的技术概念。低代码编程核心技术概念一、数据结构这里的数据结构,指一般意义上的数据表和数据字段。 类似于数据库中的表及字段的概念,也…

蓝桥杯2022 A组 python

蓝桥杯2022 A组 python A组相对于B组就五道题不一样 第一题:裁纸刀 就先把四个边剪一下,然后先行后列,蛮简单的 # 20行 横着19刀,竖着21*20 print(1921*204)第三题:质因数个数 这题我感觉就是跟一个约数个数的模板一…

【python】Twisted网络编程

Twisted什么是Twisted?为什么使用twisted?Twisted 写TCP通信基本实例- TCP服务端- TCP客户端Twisted的Deferred机制Why Deferred?Deferred TCP-ECHO客户端实现- TCP client为例,什么是Twisted? Twisted是一种非阻塞的网络服务器…

useEffect 依赖项为对象或数组时,引发不断重渲染问题的原因及解法

转载自 https://www.izhaoo.com/2021/11/01/useEffect-object-dependent/背景今天封了个轮子,对组件传入参数生成对应的动画实例,当入参变化时重新渲染新实例。自然而然想到的就是 useEffect 监听 props 依赖了,如:useEffect(() &…

ESD器件(TVS)选型考虑

参考:TOSHIBA《Basics of ESD Protection (TVS) Diodes》①VRWM: Working peak reverse voltage工作峰值反向电压:ESD保护二极管显示非常高的阻抗。高于这个电压,会通过指定大小漏电流。设计的时候,信号的最大出现电压要在这个电压…

Java基础漏洞(六)

巩固Java基础,基于韩顺平老师的课程,Java的封装、继承、多态、super()、this()、重载与重写的区别......,下面我们一点点来巩固练习。 (1)继承 继承细节1:子类无法继承父类的私有 图1 我们定义一个父类f…

Ansys Zemax | 利用 TrueFreeForm 面进行网格自由曲面的优化

在这篇文章中,我们将演示如何使用 OpticStudio 的 TrueFreeForm 面,设计AR/VR设备中的人眼追迹系统(eye-tracking subsystem),这个系统通常位于装置的楔形透镜结构中。此外,为了完成子孔径(sub-…

JSBridge:混合开发中的双向通信[Android、iOSJavaScript]

什么是WebView WebView 是移动端中的一个控件,它为 JS 运行提供了一个沙箱环境。WebView 能够加载指定的 url,拦截页面发出的各种请求等各种页面控制功能,JSB 的实现就依赖于 WebView 暴露的各种接口。 由于历史原因,IOS以8为分界…