c++ - 将 YUY2 转换为 YV12

标签 c++ image-processing yuv

我几乎可以肯定这比我想象的要简单得多,但我在互联网上搜索的时间比我愿意承认的要长得多,我试图弄清楚如何转换这两种格式。我能够从无符号字节流 (unsigned char) 中提取 Y0、Cb、Y1、Cr 数据,但我不知道这些字节在 YV12 中是如何排列的。 - 该文档是否暗示各种值实际上包含在不同的行中?

我一整天都在搜索诸如“c++ 将 YUY2 转换为 YV12”之类的内容,但完全没有找到任何教程或代码示例。我认为这会有某种形式的文档可供我使用,但关于这个特定主题的信息似乎很少。

最佳答案

看起来像 linked entry on YUY2连同 Wikipedia article on YV12使这一点非常清楚:

  • YUY2 将每两个相邻的水平像素存储为四个字节,[Y1, U, Y2, V]

  • YV12 在 M*N + 2 * (M/2 * N/2) 的连续数组中存储整个 M × N 帧) 字节。我们称数组为 byte frame[M * N * 3/2]。我们有:

    • frame[i] for i in [0, M * N)Y 值的像素。
    • frame[j] for j in [M * N, M * N * 5/4)V -每个 2 × 2 像素图 block 的值。
    • frame[j] for k in [M * N * 5/4, M * N * 6/4)U - 每个 2 × 2 像素图 block 的值。

因此,当您从 YUY2 转换为 YV12 时,您必须将 UV 数据的数量减半,可能是通过取两个相邻行的平均值。

示例:

byte YUY2Source[M * N * 2] = /* source frame */;
byte YV12Dest[M * N * 3/2];

for (unsigned int i = 0; i != M * N; ++i)
{
    YV12Dest[i] = YUY2Source[2 * i];
}

for (unsigned int j = 0; j != M * N / 4; ++j)
{
    YV12Dest[M * N + j]       = ( YUY2Source[N*(j / N/2    ) + 4 * j + 3]
                                + YUY2Source[N*(j / N/2 + 1) + 4 * j + 3] ) / 2;

    YV12Dest[M * N * 5/4 + j] = ( YUY2Source[N*(j / N/2    ) + 4 * j + 1]
                                + YUY2Source[N*(j / N/2 + 1) + 4 * j + 1] ) / 2;
}

关于c++ - 将 YUY2 转换为 YV12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12396156/

相关文章:

c++ - 写入 4 :2:0 YUV-Rawdata into an AVI-File via Video for Windows in C++

c++ - 稳定时钟如何与有限位时间表示交互?

image-processing - 图像处理-PSNR和SSIM指标是否显示平滑(降噪)质量?

python - Matplotlib 从一个全是 1 的数组中生成一个黑色图像

compression - 如何将YUV422(子采样)转换为YUV?

c - FFMPEG 用于从 yuv420p 转换为 rgb bmp 的所有操作是什么?

c++ - 这个 OpenCV 矩阵表达式的含义是什么?

c++ - 如何使用版本名称将二进制文件与库链接

math - SAD和SSD的区别

使用 GL_TEXTURE_2D 的 iOS YUV 420v 在 OpenGL 着色器中显示错误的颜色