【问题标题】:Planar YUV420 data layout平面 YUV420 数据布局
【发布时间】:2015-01-07 14:49:03
【问题描述】:

在我的项目中,我使用OpenH264 编解码器,据说它以YUV 4:2:0 planar 格式输出数据。解码后,我得到一个数组,其中包含width * height * 1.5 元素,在显示时看起来像这样的图像:

http://o3d.googlecode.com/svn/trunk/samples_webgl/assets/shaving_cream.png

为什么在主要区域下方有四个区域(其中包含 Y - 负责灰度 - 元素),而不是像我的第二张图片上的两个?这是否意味着格式不同,还是我错了,我的世界刚刚崩溃?

我认为结果应该是这样的:

【问题讨论】:

  • 从您的图像来看,您如何在线性内存中对 U 和 V 样本进行成像还不是很清楚。平面格式意味着在线性内存中将有 320x240 U 样本,然后是 320x240 V 样本(请参阅en.wikipedia.org/wiki/…)。如果您的图像表示图像应如何存储在内存中,那么您的假设是错误的,因为紫色框应该在黄色框下方。
  • 谢谢你的回答,也是正确的。但我发现 Wikipedia 上的图片有点令人困惑 - 也许它太小而无法理解。

标签: c++ image-processing h.264 codec yuv


【解决方案1】:

接受的答案是完全正确的,我只是添加更多关于转换为 YUV 值的信息:

size.total = size.width * size.height;
y = yuv[position.y * size.width + position.x];
u = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total];
v = yuv[(position.y / 2) * (size.width / 2) + (position.x / 2) + size.total + (size.total / 4)];

参考:https://en.wikipedia.org/wiki/YUV

【讨论】:

    【解决方案2】:

    这正是您假设的方式。您只是忽略了图像宽度上有一半的 U 和 V 像素。所以偶数行的 U 数据在左边,奇数行在右边。其次是V数据。

    为了让它按照您想要的方式排列,解码器必须交错 U 和 V 数据。它不这样做。只是在转换为 RGB 之前不要开始查看图像 :)

    【讨论】:

    • 谢谢:)!特别是关于奇偶线的信息。如果您想要平面表示,这是有道理的。
    【解决方案3】:

    来自 thiagolr 的图表非常准确。一个看起来更像你的准确图表会是

    Hans Passant 解释了你的看起来有 4 张图片的原因。

    【讨论】:

      猜你喜欢
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      相关资源
      最近更新 更多