YV12 到 RGB - 我的算法有什么问题?

信息处理 图像处理 颜色
2022-01-04 21:36:41

我正在尝试使用以下片段着色器将 YV12 转换为 RGB:

precision mediump float;
uniform sampler2D tex0, tex1, tex2;
varying vec2 v_texCoord;

void main(void) {
    float r, g, b, y, u, v;
    y = texture2D(tex0, v_texCoord).x;
    u = texture2D(tex1, v_texCoord).x;
    v = texture2D(tex2, v_texCoord).x;

    y = 1.1643 * (y - 0.0625);
    u = u - 0.5;
    v = v - 0.5;

    r = y + 1.5958 * v;
    g = y - 0.39173 * u - 0.81290 * v;
    b = y + 2.017 * u;

    gl_FragColor = vec4(r, g, b, 1.0);
}

下面是原始图像,然后是转换后的图像。根据输出,你能确定我可能会在哪里确定导致不正确解码的原因吗?

资源 解码图像

2个回答

输出图像的线条相互偏移,这通常是由于线条之间的 [字节] 距离不正确(步幅)。也就是说,颜色转换数学可能是正确的,但是您要么从错误的位置获取源像素和/或将输出像素放置在错误的位置。

出于性能原因,YV12 图像可能会在硬件中使用扩展步幅来提高性能。例如,320x240 YV12 图像的步幅可能为 512,这意味着数据缓冲区是 512x240 数据空间(Y 为 512x240 字节,后跟 V 和 U 的两个 256x120 数组),其中有效载荷图像在左侧,而是右侧的不可见填充。

我对片段着色器编程一无所知,但对我来说,输入和输出的字长似乎有所不同。在我看来,你不注意解包和重新打包YV12字节。