c ++ YUYV 422水平和垂直翻转

时间:2016-12-08 19:48:05

标签: c++ yuv

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

下面的垂直翻转代码完美无缺。

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组件并保持它们的顺序相同。我不相信我会丢弃像素,所以我不明白为什么我会失去定义。重申一点,我在垂直翻转时看不到这个问题(使用第一个代码片段)。

这是参考图像,请注意灯的主干:

refrence image

这是翻转的图像,灯的主干已失去定义:

flipped image

2 个答案:

答案 0 :(得分: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,我更改了循环条件,以确保它是安全的。

答案 1 :(得分:0)

m_Width * m_Height * 2不是4的倍数(YUYV格式的数据块数量。请尝试将&#39; 2&#39;更改为&#39; 4&#39;,同时{{1} }。

相关问题