YUV格式到底是什么?

简介

YUV是视频、图片、相机等应用中使用的一类图像格式,实际上是所有“YUV”像素格式共有的颜色空间的名称。 与RGB格式(红 - 绿 - 蓝)不同,YUV是用一个称为Y(相当于灰度)的“亮度”分量和两个“色度”分量表示,分别称为U(蓝色投影)和V(红色投影),由此得名。

YUV也可以称为YCbCr,虽然这些术语意味着略有不同,但它们往往会混淆并可互换使用。

Y表示亮度分量:如果只显示Y的话,图像看起来会是一张黑白照。

U(Cb)表示色度分量:是照片蓝色部分去掉亮度(Y)。

V(Cr)表示色度分量:是照片红色部分去掉亮度(Y)。

要说清楚YUV,得分别说清楚以下两点:

  • YUV的采样格式:即我们在采集图片、视频帧时,是如何获取每个像素的Y、U、V三个分量的。
  • YUV的存储格式:即Y、U、V三个分量的值,是以什么方式存储在内存或者文件中的。

为了理解这两点,破费功夫,只因没有在网上找到比较让人满意的解读。最后找到了两篇文档:

VLC提供的wiki和微软家提供的Video Rendering with 8-Bit YUV Formats

YUV采样格式

什么是扫描线(scan line)

为了说明采样格式,先说明一下待会儿会用的的概念:扫描线

什么是扫描线?这是关于电视显示的术语,用来描述电视是如何显示画面的。wiki中是这么解释的:

电视萤幕由电子枪射出的电子,经由磁场偏向后打在屏幕上而发光,因此每一个图框都由电子枪的扫描线画出来。

大概意思如下图:图片来源
在这里插入图片描述

电子枪的扫描线从左上角像素点到右下角像素点顺序移动,喷射电子显像。

我猜,这种像素的显示方式也对像素的采样方式产生了影响,YUV采样格式中就大量提到了扫描线,至于这中间是否有什么历史"恩怨",大家如果知道,不妨留言分享。

宏像素 (macropixels)

像素是视频显示的基本单位,因为它代表了屏幕上一个"点"的色彩,通常也会被形象地称为"像素点"。通常RGB格式像素点,会有Red、Green、Blue三个基本像素分量组成。也就是说,只要确定了红、绿、蓝三个像素分量就能确定这个像素将要显示什么。

同理,YUV格式也可以分为三个分量,即Y、U、V一一对应。

但和RGB不一样的是,利用人体眼睛对亮度分量(Y)敏感,而对色度分量(U和V)不敏感的原理,视频可以通过降低色度分量的采样数据,达到降低视频数据量而人眼很难分辨的目的。所以,目前流行的YUV采样,基本都是降低色度分量的采集。

也就是说,一个视频帧中,亮度分量Y的采样数不会被改变,但色度分量U和V会被降低采样数(downsampling)。如此一来,Y、U、V三个分量将无法达到和RGB一样一一对应的效果。

好在YUV所有的格式中,U、V分量的采样数是相等的,只是不同的Y分量之间,需要共享数量不足的UV分量,为了让这个共享更好的表达,YUV出现了宏像素的概念。即:当前格式下,至少需要x个像素点的采样数据,才能将这x个像素点完整表达,这几个像素点组成了一个宏像素,每个像素点称为宏像素点。所谓的完整表达,也就是让所有的Y分量都有对应的UV分量可以使用。

如果看到这里,还不是很懂,你可以先跳过这节,这对后文的阅读影响不是很大。

宏像素的概念,是从微软家的那个文档看到的,但他家没做任何解释,网上也没有。这一节的内容,实际上是本人自己琢磨了好久才总结出来的。受限知识水平,请大家谨慎参考,如果有大神发现有误,请留言帮帮小弟,一拜……再拜……

YUV4:4:4

YUV格式,采用A:B:C表示法用于描述UV色度分量相对于Y分量的采样率。这怎么理解呢,以YUV4:4:4为例。

YUV4:4:4的采样方式表示:各采样分量在扫面每个像素点时,都不会降低采样率。

在这里插入图片描述

如图,一个方格表示一个像素点,方格中的YUV分别表示有在该像素点采YUV分量。之所以用四个方格显示,是因为YUV格式中,UV分量最小时需要四个像素共享一个UV分量对。同时,共享一个UV分量对的像素点,在平面上和UV分量都有临近的关系,所以这四个像素点不会是同一条扫面线上的点,而是分布在两条扫描线上。

所以,一个宏像素最多容纳四个宏像素点。而在YUV4:X:X的表示法中,的4表达的也是这个意思。

从图可以看出,YUV4:4:4的采样方式,是对每个像素点进行Y、U、V分量的全采样。

关于内存占用,因为YUV模式的每个分量都是存储在一个字节(8bit)中的。

所以,对于四个像素,YUV4:4:4格式需要4*8 + 4*8 + 4*8 = 96位,因此,每个像素深度为24位

YUV4:2:2

YUV4:2:2的采样方式表示:水平方向Y分量与UV分量2:1采样,垂直方向不降低采样率。也就是这样:

在这里插入图片描述

水平方向上的两个像素点组成了一个宏像素,两个像素点共享一对UV像素分量。

至于U和V分量是从水平方向第一个像素采集,还是分开到两个像素采集。如果是分开采集,是先采U分量还是先采集V分量,这个可能需要更专业的解释了。根据我搜索到的资料,最准确的说法只是,在扫描线上,水平方向上的UV分量是Y分量的一半。

对于四个像素,YUV4:2:2格式需要4*8 + 2*8 + 2*8 = 64位,每个像素深度为16位

YUV4:2:0

YUV4:2:2的采样方式表示:水平和垂直方向上Y分量和UV分量对的采样比都是2:1。

目前YUV4:2:0有两种变体,一种用于MPEG-1标准如下图:

在这里插入图片描述

另一个常用语MPEG-2标准,我们经常见到的4:2:0通常都是这种。如下图:

在这里插入图片描述

对于四个像素,YUV4:2:0格式需要4*8 + 8 + 8 = 48位,每个像素深度为12位

YUV存储格式

YUV的存储格式分为打包格式(packet formats)和平面格式(planar formats)。

在打包格式中,Y,U和V组件存储在单个数组中,YUV三个分量是顺序交错存储。 像素被组织成宏像素组,其布局取决于采样格式。

在平面格式中,Y,U和V分量存储在三个不同的平面(数组)中。YUV三个分量被分开存储在三个不同的数组中。

4:4:4,24位像素深度

YUV4:4:4实际上表达的是:采样模式位4:4:4的打包存储的数据。它的存储方式如图:

在这里插入图片描述

一个小方格代表一个字节,一组连续的小方格代表一个像素。

4:2:2,16位像素深度

4:2:2的采样格式共有两种存储方式

  • YUY2
  • UYVY

它们的存储方式都是打包格式,其中每个宏像素是两个像素,编码为四个连续字节。

YUY2

在YUY2格式中,中第一个字节包含第一个Y样本,第二个字节包含第一个U(Cb)样本,第三个字节包含第二个Y样本,以及 第四个字节包含第一个V(Cr)样本,如图所示:

在这里插入图片描述

UYVY

这种格式与YUY2相同,只是字节顺序颠倒了 - 也就是说,色度和亮度字节被翻转,如图:

在这里插入图片描述

4:2:0,12位像素深度

下面要介绍的4:2:0格式都采用了平面存储模式,共有四种:

  • IMC2
  • IMC4
  • YV12
  • NV12

所有的4:2:0模式,色度分量无论是在水平还是垂直方向上,采样数都是亮度分量的1/4。

IMC2

IMC2格式的存储方式如图:

在这里插入图片描述

每个分量以一个字节存储,平面存储格式的意思就是,先存储视频帧中所有的Y分量。Y分量存储完之后,才开始存储色度分量。在IMC2格式中,YUV三分量的存储关系是:先存所有的Y分量、再存所有的V分量,最后存储U分量。

为了便于处理和表达,通常在代码中会以三个数组来分别装着三个分量。

另外需要提一嘴,在IMC2格式中,存储UV分量的内存空间步长分别是存储Y分量的一半。另外因为色度分量的采样书是Y分量的1/4,所以,及时色度分量占用空间是亮度分量的一半,也会有一些空闲的内存。

IMC4

在这里插入图片描述

和IMC2格式类似,只是U、V两个色度分量的存储顺序对调了一下。

YV12&I420

在这里插入图片描述

YV12格式的存储方式又有变化,存储色度分量的内存步幅是亮度分量的一半,首先Y分量数据以unsigned char数组的形式存储,紧跟着后面存V分量,最后存U分量。

I420和YV12的存储方式差不多,区别的地方在于,I420的Y分量后,存储的是U分量,最后存V分量,色度分量的存储顺序替换了一下。另外I420也被称为YUV420P。

YV12、I420、YUV420p这三个名词在多媒体开发中,是出现频率比较高的是那个了。大家不妨记忆一下

NV12

在这里插入图片描述

NV12格式首先存储Y分量平面,作为具有偶数行的无符号字符值数组。 Y平面后面紧跟着一个无符号字符值数组,其中包含打包的U(Cb)和V(Cr)样本。

剧终

本文以理解为主,部分讲述并不代表事实,在生产场景这已经够用了。

发布了77 篇原创文章 · 获赞 28 · 访问量 3万+
展开阅读全文

HM代码在深度学习应用调试过程中出现如下的问题,有人遇到过吗??

08-08

``` Tensor("Conv2D:0", shape=(?, 1, 1, 1), dtype=float32) Tensor("ResizeNearestNeighbor:0", shape=(?, 16, 16, 1), dtype=float32) Tensor("LeakyRelu:0", shape=(?, 4, 4, 16), dtype=float32) Tensor("LeakyRelu_1:0", shape=(?, 2, 2, 24), dtype=float32) Tensor("LeakyRelu_2:0", shape=(?, 1, 1, 32), dtype=float32) Tensor("Conv2D_4:0", shape=(?, 2, 2, 1), dtype=float32) Tensor("ResizeNearestNeighbor_1:0", shape=(?, 32, 32, 1), dtype=float32) Tensor("LeakyRelu_3:0", shape=(?, 8, 8, 16), dtype=float32) Tensor("LeakyRelu_4:0", shape=(?, 4, 4, 24), dtype=float32) Tensor("LeakyRelu_5:0", shape=(?, 2, 2, 32), dtype=float32) Tensor("Conv2D_8:0", shape=(?, 4, 4, 1), dtype=float32) Tensor("ResizeNearestNeighbor_2:0", shape=(?, 64, 64, 1), dtype=float32) Tensor("LeakyRelu_6:0", shape=(?, 16, 16, 16), dtype=float32) Tensor("LeakyRelu_7:0", shape=(?, 8, 8, 24), dtype=float32) Tensor("LeakyRelu_8:0", shape=(?, 4, 4, 32), dtype=float32) Tensor("concat:0", shape=(?, 2688), dtype=float32) Tensor("cond/Merge:0", shape=(?, 64), dtype=float32) Tensor("cond_1/Merge:0", shape=(?, 48), dtype=float32) Tensor("cond_2/Merge:0", shape=(?, 1), dtype=float32) Tensor("cond_3/Merge:0", shape=(?, 128), dtype=float32) Tensor("cond_4/Merge:0", shape=(?, 96), dtype=float32) Tensor("cond_5/Merge:0", shape=(?, 4), dtype=float32) Tensor("cond_7/Merge:0", shape=(?, 256), dtype=float32) Tensor("cond_8/Merge:0", shape=(?, 192), dtype=float32) Tensor("cond_9/Merge:0", shape=(?, 16), dtype=float32) D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 1/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 302/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 303/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 304/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 305/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 306/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 307/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 308/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 309/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 310/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 311/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 312/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 313/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 314/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 315/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 316/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 317/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 318/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 319/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 320/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 321/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 322/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 323/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 324/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 325/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 326/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 327/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 328/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 329/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 330/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 331/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 332/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 333/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 334/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 335/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 336/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 337/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 338/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 339/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 340/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 341/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 342/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 343/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 344/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 345/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 346/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 347/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 348/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 349/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 350/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 351/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 352/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 353/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 354/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 355/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 356/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 357/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 358/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 359/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 360/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 361/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 362/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 363/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 364/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 365/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 366/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 367/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 368/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 369/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 370/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 371/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 372/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 373/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 374/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 375/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 376/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 377/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 378/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 379/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 380/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 381/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 382/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 383/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 384/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 385/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 386/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 387/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 388/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 389/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 390/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 391/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 392/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 393/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 394/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 395/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 396/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 397/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 398/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 399/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 400/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 401/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 402/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 403/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 404/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 405/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 406/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 407/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 408/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 409/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 410/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 411/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 412/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 413/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 414/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 415/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 416/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 417/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 418/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 419/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 420/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 421/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 422/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 423/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 424/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 425/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 426/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 427/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 428/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 429/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 430/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 431/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 432/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 433/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 434/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 435/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 436/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 437/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 438/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 439/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 440/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 441/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 442/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 443/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 444/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 445/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 446/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 447/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 448/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 449/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 450/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 451/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 452/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 453/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 454/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 455/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 456/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 457/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 458/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 459/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 460/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 461/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 462/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 463/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 464/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 465/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 466/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 467/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 468/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 469/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 470/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 471/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 472/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 473/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 474/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 475/501 416x240 -------- Predicting Time: 15.445 sec. -------- HM software: Encoder Version [16.5] (including RExt)[Windows][VS 1900][64 bit] python video_to_cu_depth.py D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv 416 240 32 Input File : D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv Bitstream File : str.bin Reconstruction File : rec.yuv Real Format : 416x240 50Hz Internal Format : 416x240 50Hz Sequence PSNR output : Linear average only Sequence MSE output : Disabled Frame MSE output : Disabled Cabac-zero-word-padding : Enabled Frame/Field : Frame based coding Frame index : 0 - 49 (50 frames) Profile : main CU size / depth / total-depth : 64 / 4 / 4 RQT trans. size (min / max) : 4 / 32 Max RQT depth inter : 3 Max RQT depth intra : 3 Min PCM size : 8 Motion search range : 64 Intra period : 1 Decoding refresh type : 0 QP : 32.00 Max dQP signaling depth : 0 Cb QP Offset : 0 Cr QP Offset : 0 QP adaptation : 0 (range=0) GOP size : 1 Input bit depth : (Y:8, C:8) MSB-extended bit depth : (Y:8, C:8) Internal bit depth : (Y:8, C:8) PCM sample bit depth : (Y:8, C:8) Intra reference smoothing : Enabled diff_cu_chroma_qp_offset_depth : -1 extended_precision_processing_flag : Disabled implicit_rdpcm_enabled_flag : Disabled explicit_rdpcm_enabled_flag : Disabled transform_skip_rotation_enabled_flag : Disabled transform_skip_context_enabled_flag : Disabled cross_component_prediction_enabled_flag: Disabled high_precision_offsets_enabled_flag : Disabled persistent_rice_adaptation_enabled_flag: Disabled cabac_bypass_alignment_enabled_flag : Disabled log2_sao_offset_scale_luma : 0 log2_sao_offset_scale_chroma : 0 Cost function: : Lossy coding (default) RateControl : 0 Max Num Merge Candidates : 5 TOOL CFG: IBD:0 HAD:1 RDQ:1 RDQTS:1 RDpenalty:0 SQP:0 ASR:0 FEN:1 ECU:0 FDM:1 CFM:0 ESD:0 RQT:1 TransformSkip:1 TransformSkipFast:1 TransformSkipLog2MaxSize:2 Slice: M=0 SliceSegment: M=0 CIP:0 SAO:1 PCM:0 TransQuantBypassEnabled:0 WPP:0 WPB:0 PME:2 WaveFrontSynchro:0 WaveFrontSubstreams:1 ScalingList:0 TMVPMode:1 AQpS:0 SignBitHidingFlag:1 RecalQP:0 Non-environment-variable-controlled macros set as follows: RExt__DECODER_DEBUG_BIT_STATISTICS = 0 RExt__HIGH_BIT_DEPTH_SUPPORT = 0 RExt__HIGH_PRECISION_FORWARD_TRANSFORM = 0 O0043_BEST_EFFORT_DECODING = 0 Input ChromaFormatIDC = 4:2:0 Output (internal) ChromaFormatIDC = 4:2:0 ``` 问答

我在网上找了个bmp转YUV的程序进行修改,但读不出数据,不知什么问题,有谁懂的请帮忙看下,谢谢了

04-28

#include <stdio.h> #include <stdlib.h> #include "bmp2rgb.h" u_int8_t BMP2RGB(BITMAPFILEHEADER file_header,BITMAPINFOHEADER info_header, FILE* bmpFile, u_int8_t* rgbBuf);//24bit RGB u_int8_t RGB24ToYUV420(int Width,int Height,u_int8_t* rgbBuf,u_int8_t*YuvBuffer); #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) int main(int argc, char** argv) { //设置命令行参数 argv[1]= "boot_logo.bmp"; argv[2]="boot_logo.yuv"; //相当于设置文件名 char* bmpFileName = argv[1]; char* yuvFileName = argv[2]; //打开文件 FILE* bmpFile = fopen(bmpFileName, "rb"); if (bmpFile == NULL) { printf(" Open the BMP file.\n"); exit(1); } else { printf("The BMP file is %s\n", bmpFileName); } FILE* yuvFile = fopen(yuvFileName, "wb"); if (yuvFile == NULL) { printf("Cannot open the YUV file.\n"); exit(1); } else { printf("The YUV file is %s\n", yuvFileName); } //读取BMP文件头,信息头,读取错误时的处理代码 BITMAPFILEHEADER file_header; BITMAPINFOHEADER info_header; if (fread(&file_header, sizeof(BITMAPFILEHEADER), 1, bmpFile) != 1) if (file_header.bfType != 0x4D42) { printf("Not BMP file.\n"); exit(1); } if (fread(&info_header, sizeof(BITMAPINFOHEADER), 1, bmpFile) != 1) { printf("read info header error!"); exit(1); }//结束读取BMP文件头 //读取图像尺寸 int width = info_header.biWidth; int height = info_header.biHeight; //开辟缓冲区 buf u_int8_t* yBuf = (u_int8_t*)malloc(height*width); u_int8_t* uBuf = (u_int8_t*)malloc(height*width / 4); u_int8_t* vBuf = (u_int8_t*)malloc(height*width / 4); u_int8_t* rgbBuf = (u_int8_t*)malloc(height*width * 3); u_int8_t*YuvBuffer =(u_int8_t*)malloc(height*width * 5); if (yBuf == NULL || uBuf == NULL || vBuf == NULL || rgbBuf == NULL || YuvBuffer==NULL) { printf("Not enough memory\n"); exit(1); } //BMP与RGB的转换,得到RGB数据 if (BMP2RGB(file_header, info_header, bmpFile, rgbBuf)) { printf("BMP2RGB error\n"); exit(1); } //RGB与YUV的转换,得到YUV数据 // int flip = 0; /*读取到的图像数据是倒序存放的,flip=0保证了RGB2YUV可以正确地对其转换*/ /* if (RGB2YUV(width, height, rgbBuf, yBuf, uBuf, vBuf, flip)) { printf("RGB2YUV error\n"); exit(1); } //将yuv按顺序写入yuvfile文件 fwrite(yBuf, 1, width * height, yuvFile); fwrite(uBuf, 1, (width * height) / 4, yuvFile); fwrite(vBuf, 1, (width * height) / 4, yuvFile);*/ if( RGB24ToYUV420( width, height, rgbBuf,YuvBuffer)) { printf("RGB24ToYUV420 error\n"); exit(1); } int len=0; len= fwrite(YuvBuffer, 1,sizeof(YuvBuffer), yuvFile); printf("len ==%d byte\n",len); //打印宽高,方便yuv观看程序打开 printf("width is %d", width); printf("\n"); printf("height is %d", height); printf("\n"); //清理内存 free(rgbBuf); free(YuvBuffer); free(yBuf); free(uBuf); free(vBuf); fclose(bmpFile); fclose(yuvFile); return 0; } u_int8_t BMP2RGB(BITMAPFILEHEADER file_header,BITMAPINFOHEADER info_header, FILE* bmpFile, u_int8_t* rgbBuf) { BITMAPFILEHEADER file_h=file_header; BITMAPINFOHEADER info_h=info_header; FILE* pFile =bmpFile; int w=0,h=0; //确定像素的实际点阵数 w = (info_h.biWidth*info_h.biBitCount + 31) / 32 * 4;//w为实际一行的字节数 h = info_h.biHeight;//h为列数 // printf("w==%d,h==%d\n",w,h); //开辟实际字节数量的缓冲区,读数据,一次读取一个字节 u_int8_t* dataBuf = (u_int8_t*)malloc(w*h); /*使用文件头的字节偏移属性bfOffBits 直接把文件指针定位到像素值数据的起始 */ fseek(pFile, file_h.bfOffBits, 0); fread(dataBuf, 1, w*h, pFile); unsigned char* data = dataBuf; u_int8_t* rgb = rgbBuf; //开始写入rgb int i, j; for (j = 0; j < h; j++)//j控制行循环 { for (i = 0; i < w; i += 3)//i控制列循环 { *rgb = data[i + w*j];//B *(rgb + 1) = data[i + w*j + 1];//G *(rgb + 2) = data[i + w*j + 2];//R rgb += 3; } } //释放内存 free(dataBuf); return 0; } /***************************************************************************************************************/ u_int8_t RGB24ToYUV420(int Width,int Height,u_int8_t* rgbBuf,u_int8_t*YuvBuffer) { u_int8_t* yuvBuf=YuvBuffer;//YUV空间 int nWidth=Width; int nHeight=Height; /////////////////////下面转换算法是网上查到的 int i, j; u_int8_t*bufY = yuvBuf; u_int8_t*bufU = yuvBuf + nWidth * nHeight; u_int8_t*bufV = bufU + (nWidth* nHeight* 1/4); u_int8_t*Y=bufY; u_int8_t*U=bufU; u_int8_t*V=bufV; u_int8_t*bufRGB; unsigned char y, u, v, r, g, b; if (NULL==rgbBuf) { printf("NULL==rgbBuf\n"); return 1 ; } for (j = 0; j<nHeight;j++) { bufRGB = rgbBuf + nWidth * (nHeight - 1-j) * 3 ; for (i = 0;i<nWidth;i++) { int pos = nWidth * i + j; r= *(bufRGB++); g = *(bufRGB++); b = *(bufRGB++); y =(unsigned char)(( 66 * r + 129 * g + 25 * b + 128) >>8) + 16;//16 v = (unsigned char)((-38 * r - 74 * g + 112 * b + 128) >>8) +128 ; //128 u = (unsigned char)((112 * r - 94 * g - 18 * b + 128) >> 8) + 128 ; *(bufY++)=max(0,min(y, 255 )); if (j%2==0&&i%2 ==0) { if (u>255) { u=255; } if (u<0) { u = 0; } *(bufU++) =u; //存u分量 } else { //存v分量 if (i%2==0) { if (v>255) { v = 255; } if (v<0) { v = 0; } *(bufV++) =v; } } } } return 0; } ``` #include <stdio.h> #include "sys/types.h" #include <stdlib.h> typedef unsigned long DWORD;//32bit typedef unsigned short WORD;//16bit typedef unsigned long LONG; //32bit typedef struct tagBITMAPFILEHEADER { //0x00~0x01,说明文件的类型 WORD bfType; //0x02~0x05,说明文件的大小,用字节B为单位 DWORD bfSize; //0x06~0x07,保留,设置为0 WORD bfReserved1; //0x08~0x09,保留,设置为0 WORD bfReserved2; //0x0a~0x0d,说明从BITMAP_FILE_HEADER结构开始到实际的图像数据之间的字节偏移量 DWORD bfOffBits; } BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { //0x0e~0x11,说明当前结构体所需字节数 DWORD biSize; //0x12~0x15,以像素为单位说明图像的宽度 LONG biWidth; //0x16~0x19,以像素为单位说明图像的高度 LONG biHeight; //0x1a~0x1b,说明位面数,必须为1 WORD biPlanes; //0x1c~0x1d,说明图像的位深度 WORD biBitCount; //0x1e~0x21,说明图像是否压缩及压缩类型 DWORD biCompression; //0x22~0x25,以字节为单位说明图像大小,必须是4的整数倍 DWORD biSizeImage; //0x26~0x29,目标设备的水平分辨率,像素/米 LONG biXPelsPerMeter; //0x2a~0x2d,目标设备的垂直分辨率,像素/米 LONG biYPelsPerMeter; //0x2e~0x31,说明图像实际用到的颜色数,如果为0,则颜色数为2的biBitCount次方 DWORD biClrUsed; //0x32~0x35,说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。 DWORD biClrImportant; } BITMAPINFOHEADER; ``` 运行环境linux,bmp图片24位 运行结果: The BMP file is boot_logo.bmp The YUV file is boot_logo.yuv len ==8 byte width is 185729024 height is 0 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览