hi3516直接对yuv图片进行目标检测


原文链接: hi3516直接对yuv图片进行目标检测

视频编解码(三)YUV420,YUV420p,I420,YV12等格式解析 - 夜风里唱的专栏
海思AI芯片(Hi3519A/3559A)方案学习(二十四)如何直接对yuv图片进行目标检测 - ltshan139的专栏
yuv 图像里的stride和plane的解释 - dielucui7698的博客
(1条消息)海思Hi3519A MPP从入门到精通(五 YUV图像格式) - Enjoy Coding
详解数据格式 图文详解YUV420数据格式_网络_weixin_30411819的博客-CSDN博客

直接对YUV格式图片的识别

矛盾点: VPSS中所有channel仅仅支持输出YUV格式,但是目标检测算法模型本身只支持BGR/RGB格式数据。
解决方式: 利用NNIE的硬件(只支持YVU420SP和YVU422SP)来做颜色转换 YUV 转 BGR

  image_type 决定了输入图片的数据格式 选择YVU420SP或YVU422SP

如果想硬解码图片而且做缩放的话,VDEC需要bind到VPSS,然后从VPSS里面读取数据。
这里面首先要注意一点:对于3519av100来说,VPSS中所有channel都仅仅支持YUV格式,它们包括YVU-SP420/YVU-SP422/YUV-SP420/YUV-SP422/YUV400。与它们相对应的宏有PIXEL_FORMAT_YVU_SEMIPLANAR_420(即NV21)等。

由前面可知,VPSS不支持YUV转换RGB处理,那么从VPSS里面获取的YUV数据怎么扔到nnie里面来做推理? 毕竟目前所有的经典目标检测算法模型本身只支持BGR/RGB格式数据,那么如何将YUV数据先转换成BGR再输入到网络模型呢? 可以调用opencv库来做这个转换,当然更笨的办法是根据yuv转RGB公式来手写这段转换代码。但是更好的办法是利用NNIE的硬件来做颜色转换。

其方法是,在使用ruyistudio来进行模型量化时,image_type选择YVU420SP或YVU422SP,当然选择哪一个,得取决于VPSS里面得图像数据格式,不过要注意得一点是,VPSS支持多种YUV格式,而ruyistudio只支持YVU420SP和YVU422SP两种,换句话说,NNIE硬件只支持这两种格式转换到RGB空间。至于是RGB还是BGR,它由下图右边红框RGB_order得值来决定,这个得和算法模型本身支持得数据格式输入对应起来。

实际运行时, NNNI硬件会根据 基于上面选项所生成得WK模型文件 来自动将YUV格式得图像数据转换成BGR/RGB,然后再进行推理识别,整个转换过程在内部完成,不需要外部软件参与。

  1. nnie_mapper 参数
    image_type 决定了输入图片的数据格式 (配置)支持 YVU420SP PIXEL_FORMAT_YVU_SEMIPLANAR_420(即NV21)
    RGB_order 决定了wk模型进行运算时支持的格式 默认为BGR {BBBBB...GGGGG...RRRRR...}

RGB_order {RGB, BGR}

image_type 设置为 0 时,该参数无效;
image_type 设置为 1 时,表示输入给网络的 RGB 图像的 RGB 三通道的顺序;
image_type 设置为 3、5 时,表示 YUV 图像数据转成 RGB Planar 或者 BGR Planar 图像输入给网络。
本参数可省略,默认为BGR

image_type {0,1,3,5} 表示网络实际执行时输入给网络的数据类型,该配置跟 image_list 相关。
1:表示网络数据输入为 SVP_BLOB_TYPE_U8(普通的灰度图和 RGB 图)类型;
3:网络数据输入为 SVP_BLOB_TYPE_YVU420SP 类型; PIXEL_FORMAT_YVU_SEMIPLANAR_420
5:网络数据输入为 SVP_BLOB_TYPE_YVU422SP 类型; PIXEL_FORMAT_YVU_SEMIPLANAR_422
当配置为 3 或者 5 时,image_list 配置为 RGB 图片的list 文件。

image_type选择YVU420SP或YVU422SP,当然选择哪一个,得取决于VPSS里面得图像数据格式,不过要注意得一点是,VPSS支持多种YUV格式,而ruyistudio只支持YVU420SP和YVU422SP两种,换句话说,NNIE硬件只支持这两种格式转换到RGB空间。至于是RGB还是BGR,它由下图右边红框RGB_order得值来决定,这个得和算法模型本身支持得数据格式输入对应起来。

YUV格式图片的识别
如果想硬解码图片而且做缩放的话,VDEC需要bind到VPSS,然后从VPSS里面读取数据。这里面首先要注意一点:对于3519av100来说,
VPSS中所有channel都仅仅支持YUV格式,它们包括YVU-SP420/YVU-SP422/YUV-SP420/YUV-SP422/YUV400。
与它们相对应的宏有PIXEL_FORMAT_YVU_SEMIPLANAR_420(即NV21)、PIXEL_FORMAT_YUV_SEMIPLANAR_420(即NV12)等。
————————————————
版权声明:本文为CSDN博主「ltshan139」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/avideointerfaces/article/details/102660824

yuv420p 和 YUV420的区别 在存储格式上有区别
yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv

 YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。

YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YVU420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YVU420SP

  1. YUV简介

YUV格式有三大类:planar,packed,semi-planar。

YUV420P 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 YYYY....U.V.

对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。 YUV...

YUV420SP 对于semi-planar的YUV格式,先连续存储所有像素点的Y,紧接着连续交叉存储所有像素点的U,V。 YYYY....UV..

YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

3.2 YUV420p和YUV420sp具体分类和详情

3.2.1 YUV420p:又叫planer平面模式,Y ,U,V分别在不同平面,也就是有三个平面。

  YUV420p又分为:他们的区别只是存储UV的顺序不一样而已。

  I420(YU12):  安卓的模式。存储顺序是先存Y,再存U,最后存V。YYYYUUVV

  YV12:       存储顺序是先存Y,再存V,最后存U。YYYYVVUU

3.2.2 YUV420sp:又叫bi-planer或two-planer双平面,Y一个平面,UV在同一个平面交叉存储。

  NV12:IOS只有这一种模式。存储顺序是先存Y,再UV交替存储。YYYYUVUV

  NV21:安卓的模式。存储顺序是先存Y,再存U,再VU交替存储。YYYYVUVU

————————————————
版权声明:本文为CSDN博主「EnjoyCodingAndGame」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ywcpig/article/details/85230796

最近拿到了一块液晶显示屏,采用NTSC隔行扫描制式输出图像,其采用的颜色格式为YUV4:2:2的UYVY格式,可是某视频解码器输出的颜色格式是YUV4:2:0的I420格式。
那么,就必须在两者之间进行一次转换,
其中YUV4:2:0 I420是以平面(planner)格式存放的, YYYY.... U. V.
而UYVY则是以紧缩(packet)格式存放的。

plane一般是以luma plane、chroma plane的形式出现,其实就是luma层和chroma层,就像RGB,要用三个plane来存。

最近在做HI5321的一个项目,其中遇到一个关键性的技术问题,我们的图像处理程序需 要的是rgb888格式的图像文件,而我从hi3521获取的视频流是yuv420sp格式的图片帧,问题来了,现在我需要将yuv420sp格式的一帧 图像转换成rgb888格式的图片,其实我的目的是要rgb888图像数据。yuv420sp的yuv分量在内存储存的方式是y分量单独存储,uv分量交 叉存储。好了,可以做了,但是当我打印yuv420sp帧信息的时候发现这个720*576的一帧图片的stride(也就是跨距)居然是768,不解, 知道现在即便我已经成功将yuv420sp的一帧图片转成了bmp位图,我依然不明白这个多出来的768-720=48字节是什么。在没有考虑跨距的情况 下,我直接从yuv分量的地址出读取个分量而后获取rgb数据保存成bmp位图,但bmp完全错乱,哪里出了问题。肯定是跨距,跨距:一定会大于等于帧宽 度并且是4的倍数,720和768之间是4的倍数的数多了,为什么是768?好吧!既然是在不足4的倍数的情况下需要在行末补0,那我权当这48字节就在 每行的末尾。那么在读取yuv分量的时候必定要偏移地址。试一试,bmp果真保存成功,就像抓拍的图片一样,当然其中技术细节大家都知道,yuv换算成 rgb的公式我知道的不少于3个。

  写这段记录的目的就是想说这个stride的问题,所以在进行yuv420p,yuv420sp,等视频帧转换时一定要注意跨距stride这个参数

##########

最近在学习视频的颜色空间转换,由于摄像机拍出来的视频很多都是用YUV格式保存的,而颜色空间的转换必须在RGB颜色模型上才能完成,所以第一步自然就是将YUV颜色模型转成RGB颜色模型。在网上查到了许多的YUV与RGB互转的公式,但是总觉得有些杂乱,没有系统的总结。

首先说一说YUV颜色模型,单单就YUV颜色模型来说,就有很多中叫法,而且总是让人颇感困惑。一般来讲,我们把YUV、YUV、YCbCr, YPbPr包含在YUV颜色模型的范围内,其中Y都表示亮度,UV表示两个色度分量,但是具体的颜色模型的用途又各不相同,当然,他们与RGB的互转公式也就不尽相同。那就先说说这些不同叫法的YUV的用途和由来。在电视系统发展的早期,YUV和YUV都是颜色信息的模拟信号编码形式,虽然Y和Y都表示亮度,但是两种亮度的意义却天差地别,Y用来代指luminance,表示的是自然颜色的亮度,而Y代指luma,表示的是经过伽马压缩之后电信号的强度。在现在的计算机系统中,YUV一般用来代指YCbCr,用来表示文件的编码格式,用于数字视频的编码,而YPbPr颜色模型常常用在模拟分量视频中。所以YUV颜色模型到RGB颜色模型的转换,应该对应两种方式,分别是模拟YUV->模拟RGB、数字YUV->数字RGB。不过因为标清、高清、以及超清幅面,YUV转RGB的权重值各不相同,需要将模拟信号和数字信号再做一次幅面划分,就出现了2*3 = 6,6中转换公式。

1.模拟YUV->模拟RGB

  1) BT601(标清国际定义)

//********************* BT601 *********************************//
// Y = 0.299 * R + 0.587 * G + 0.114 * B      //
// Pb =-0.169 * R - 0.331 * G + 0.500 * B //
// Pr = 0.500 * R - 0.439 * G - 0.081 * B //
// R = Y + 1.402* Pr              //
// G = Y - 0.344 * Pb - 0.792* Pr                 //
// B = Y + 1.772 * Pb              //
//
******************* BT601 ***********************************//
  2)BT709(高清)

//********************* BT601 *********************************//
// Y = 0.213 * R + 0.715 * G + 0.072 * B      //
// Pb =-0.115 * R - 0.385 * G + 0.500 * B //
// Pr = 0.500 * R - 0.454 * G - 0.046 * B //
// R = Y + 1.402* Cr              //
// G = Y - 0.344 * Cb - 0.792* Cr                 //
// B = Y + 1.772 * Cb              //
//
******************* BT601 ***********************************//
2 数字YUV->数字RGB

  1)BT601

//********************* BT601 *********************************//
// Y = 16 + 0.257 * R + 0.504 * g + 0.098 * b //
// Cb = 128 - 0.148 * R - 0.291 * g + 0.439 * b //
// Cr = 128 + 0.439 * R - 0.368 * g - 0.071 * b //
// R = 1.164 *(Y - 16) + 1.596 *(Cr - 128) //
// G = 1.164 *(Y - 16) - 0.392 *(Cb - 128) - 0.812 *(Cr - 128)//
// B = 1.164 *(Y - 16) + 2.016 *(Cb - 128) //
//
******************* BT601 ***********************************//
  2)BT709

//********************* BT709 *********************************//
// Y = 16 + 0.183 * R + 0.614 * g + 0.062 * b //
// Cb = 128 - 0.101 * R - 0.339 * g + 0.439 * b //
// Cr = 128 + 0.439 * R - 0.399 * g - 0.040 * b //
// R = 1.164 *(Y - 16) + 1.792 *(Cr - 128) //
// G = 1.164 *(Y - 16) - 0.213 *(Cb - 128) - 0.534 *(Cr - 128)//
// B = 1.164 *(Y - 16) + 2.114 *(Cb - 128) //
//
******************* BT709 ***********************************//
至于超清幅面的计算公式,大家可以按照下面的推导方式自己推导一下。

模拟RGB转YUV的推导公式 :

Wr + Wg + Wb = 1; UMax = 0.5; VMax = 0.5
Y = Wr * R + Wg * G + Wb * B;
Pb = Umax * (B - Y) / (1 - Wb);
Pr = Vmax * (R - Y) / (1 - Wr);
  

数字RGB转YUV的推导公式:

Wr + Wg + Wb = 1; Umax = Vmax = 0.5;
Y = 16 + 219 * (Wr * R + Wg * G + Wb * B) / 255;
Cb = 128 + 224 * (Umax * (B - Y) / (1 - Wb)) / 255;
Cr = 128 + 224 * (Vmax * (R - Y) / (1 - Wr)) / 255;
  

BT601 Wr = 0.299 Wg = 0.587 Wb = 0.114

BT709 Wr = 0.2126 Wg = 0.7152 Wb = 0.0722

BT2020 Wr = 0.2627 Wg = 0.678 Wb = 0.0593

`