文章目录

  • 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 yuv444if __name__=='__main__': img = cv2.imread("./zebra_cls.jpg")     # bgr  hwcprint("cv2读图shape:", img.shape)# 直接resize,其它缩放图片方式个性化使用 img = cv2.resize(img,(672,672))         # bgr  hwcprint("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转yuv444img = nv12Toyuv444(nv12, (672,672))print("yuv444的shape:", img.shape)# 变换数据排布layoutimg = 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

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

  1. ffmpeg学习十三:图像数据格式的转换与图像的缩放

    一.实现图像数据格式转换与图像缩放的三个重要函数 ffmpeg实现图像数据格式的转换以及图片的缩放的功能,主要使用swscale.h中的三个函数: sws_getContext() sws_scale ...

  2. java nat 端口转发_NAT网络地址转换——静态NAT,端口映射(实操!!)

    NAT概述 NAT(Network Address Translation,网络地址转换)是1994年提出的.当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但 ...

  3. linux配置nat端口转换,NAT网络地址转换——静态NAT,端口映射(实操!!)

    NAT概述 NAT(Network Address Translation,网络地址转换)是1994年提出的.当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但 ...

  4. 【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”

    [MATLAB Image Processing Toolbox 入门教程六] 1 gray2ind函数 2 ind2gray函数 3 mat2gray函数 4 rgb2gray函数 5 rgb2in ...

  5. OpenCV图像颜色模型转换:cvtColor函数的使用

    Opencv提供了不同颜色模型之间转换的函数cvtColor,可以很容易的将一种颜色模型转换为另一种颜色模型. 原型 CV_EXPORTS_W void cvtColor( InputArray sr ...

  6. Foggy_driving数据集下载以及将其转换成VOC数据格式

    Foggy_driving数据集官方下载地址 百度网盘下载链接:https://pan.baidu.com/s/1q4dhnlX-doxlt13Mi-uFZQ 提取码:2ap3 VOC格式的Foggy ...

  7. 使用ffmpeg进行图像格式转换以及图像缩放/sws_scale/linux/c++/c/rgb-yuv420

    利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW ...

  8. 软件之间的数据格式对接往往将_XRD数据格式的转换和TXT格式数据正确导入Jade的办法...

    点击上方蓝色文字可以订阅哦! 前两天不慎删除了<TXT格式数据导入Jade的方法>一文,今天索性将该文章内容充实一下重新发布出来,希望对大家有用. XRD数据格式的转换 测完XRD以后,从 ...

  9. python图片保存jpg、show变成bmp_Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中...

    Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中 我就废话不多说了,直接上代码吧! import Image from datetime import datetime impor ...

最新文章

  1. 【智能语音】ROC-RK3308-CC Amazon Alexa固件发布
  2. python教程:os.chdir() 基本用法
  3. distinct的用法
  4. spring boot与spring mvc的区别是什么?
  5. docker镜像为什么要采用分层结构
  6. 华为Mate 40新功能上线,抬手即可付款!
  7. Dota2团战AI击败人类最全解析:能团又能gank,AI一日人间180年
  8. 清除img和文字间的空隙【vertical-align的用途】
  9. keil 4c语言 百度经验,Keil教程(4)
  10. MAC下Charles的破解版
  11. 机床数据采集之凯恩帝(KND)机床 IP地址设置
  12. JS实现快递单打印功能
  13. 糖友日常生活需要注意什么
  14. 基于python的招聘信息可视化系统
  15. Designing Machine Learning Systems with Python
  16. Linux系统Initramfs机制
  17. 用python编写名片_python实现简单名片管理系统
  18. mybatis sql解析问题(JSQLParserException)
  19. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记...
  20. 数据如何变成知识,第 3 部分 提取暗数据

热门文章

  1. Wondershare EDraw Max多种具有模块化特征
  2. 《廖雪峰Git教程》学习记录
  3. (三)深入理解蓝牙BLE之“信道管理”
  4. Vivado驱动安装
  5. “xxx“不是内部或外部命令,也不是可运行的程序
  6. 【秋招】计算机视觉面试题
  7. 大数据下的精准营销模式
  8. 电源拓扑从入门到精通
  9. iphone gamecenter GKErrorDomain code =17
  10. 在你朋友面前伪装黑客2(程序代码)