Столбцы преобразования yuv в rgb не выровнены

Я конвертирую кадр YUV422 в файл PPM - (RGB888).

Картинка конвертируется в основном. Цвета в порядке. Но каждый кажется ряд косой, как будто лишний

Вот функция преобразования кадров:

BYTE* CYUV::toRGB()
{
    BYTE*   rgb = new BYTE[m_width*m_height*3];
    BYTE*   rgb_ret = rgb;
    BYTE*   p_yuv = m_yuv_frame;

    for (int i=m_width*m_height/2; i--;)
    {
        BYTE    y, u, v, y2;
        BYTE    r,g, b;

        y2 = *p_yuv++;
        v = *p_yuv++;
        y = *p_yuv++;
        u = *p_yuv++;

        r = (y + 1.370705 * (v - 128));
        g = (y - (0.698001 * (v - 128)) - (0.337633 * (u - 128)));
        b = (y + (1.732446 * (u - 128)));
        *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b;
        *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g;
        *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r;


        r = (y2 + 1.370705 * (v - 128));
        g = (y2 - (0.698001 * (v - 128)) - (0.337633 * (u - 128)));
        b = (y2 + (1.732446 * (u - 128)));
        *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b;
        *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g;
        *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r;


    }
    return rgb_ret;
}

Я считаю, что фактическое преобразование пикселя yuv в rgb является правильным, потому что я пробовал много других формул с искаженными результатами цвета.

Что касается файла PPM, это тоже хорошо, так как все программы для чтения изображений работают с ним.

Что касается оригинального кадра YUV4222, то он в порядке - я показываю его с помощью SDL без этого искажения.

Какие-либо предложения?

ТИА

Кен


person user3182551    schedule 01.04.2014    source источник


Ответы (1)


ОК: Решил это.

Это было достаточно просто: запишите преобразованный пиксель y ПЕРЕД y2.

Там было ТАК много решений, но немногие кажутся полностью правильными.

К вашему сведению: это работает, но только для формата yuv 4:2:2. Кажется, это самый распространенный файл с меткой Fourcc YUYV. yuv 4:2:0 гораздо сложнее преобразовать. yuv 4:4:4 должно быть таким же, как это решение, извлекающее только 1 компонент y и записывающее только один триплет rgb. (не могу это проверить, но это был комментарий вместе с этим решением.

Надеюсь, это поможет кому-то.

Кен

person user3182551    schedule 02.04.2014