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

标签 c++ yuv

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

这是引用图片,请注意灯杆:

refrence image

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

flipped image

最佳答案

您还需要在循环中交换 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,我更改了循环条件以绝对确保它是安全的。

关于c++ YUYV 422 水平和垂直翻转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41047632/

相关文章:

c++ - 第三方API中的编译错误-Visual Studio

c++ - 在 C++ 中删除一行中的所有字符直到模式匹配的最快方法是什么?

c++ - 如何获取元素的个数

C++ 将选项传递给可执行文件

c++ - FFMPEG 4.4 如何在 Windows 上将 NV12 格式转换为 YUV420?

image-processing - 如何处理RGB到YUV的转换

c++ - 在 Windows 上配置 boost 构建

android - 关于图像格式 NV21 和它似乎具有的不同内存布局的混淆

video - S920(I420平面)格式的组织

DirectShow RGB-YUV 滤镜