【问题标题】:c++ YUYV 422 Horizontal and Vertical Flippingc++ YUYV 422 水平垂直翻转
【发布时间】:2016-12-08 19:48:04
【问题描述】:

我在内存中有一个 uint8_t YUYV 422(交错)图像数组,我希望能够垂直和水平翻转它。我已经成功实现了垂直翻转,但同时水平和垂直翻转时遇到问题。

下面我的垂直翻转代码运行良好。

int counter = 0;
int array_width = 2; // YUYV

for (int h = (m_Width * m_Height * array_width) - m_Width * array_width; h > 0; h -= m_Width * array_width)
{
    for (int w = 0; w < m_Width * array_width; w++)
    {
         flipped[counter] = buffer[h + w];
         counter++;
    }
}

但是,以下垂直和水平翻转代码似乎可以工作,但缺少定义。为了更好地理解我所指的内容,请查看我的示例图片。

int x = 0;
for (int n = m_Width * m_Height * 2 - 1; n >= 0; n -= 4)
{
    flipped[x] = buffer[n - 3]; // Y0
    flipped[x + 1] = buffer[n - 2]; // U
    flipped[x + 2] = buffer[n - 1]; // Y1
    flipped[x + 3] = buffer[n]; // V

    x += 4;
}

如您所见,我正在移动 YUYV 组件并保持它们的顺序相同。我不相信我会丢失像素,所以我不明白为什么我会失去定义。重申一下,我在垂直翻转时没有看到这个问题(使用第一个代码sn-p)。

这是参考图片,请注意灯杆:

这是翻转的图像,灯杆已经失去了清晰度:

【问题讨论】:

  • 请将图片发布为图片而不是链接。没有多少人会真正打开链接查看图片,因此如果您希望人们查看图片并因此有更好的机会帮助您,最好将它们直接作为图片发布。

标签: c++ yuv


【解决方案1】:

您还需要在循环中交换 Y0 和 Y1。

int x = 0;
for (int n = m_Width * m_Height * 2 - 1; n >= 3; n -= 4)
{
    flipped[x] = buffer[n - 1]; // Y1->Y0
    flipped[x + 1] = buffer[n - 2]; // U
    flipped[x + 2] = buffer[n - 3]; // Y0->Y1
    flipped[x + 3] = buffer[n]; // V

    x += 4;
}

当我这样做时,由于您正在访问 n - 3,因此我更改了循环条件以确保它是安全的。

【讨论】:

  • 非常感谢@Mark 更改 Y 值解决了我的问题。感谢所有 cmets 和帮助。
【解决方案2】:

m_Width * m_Height * 2不是4的倍数(YUYV格式的数据块个数。试试把'2'改成'4',还有array_width

【讨论】:

  • 这种情况令人困惑。由于 2 个像素占用 4 个字节,因此每个像素有 2 个字节,因此* 2 是正确的。
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2015-12-28
相关资源
最近更新 更多