Как конвертировать yuy2 в BITMAP в C ++ - PullRequest
6 голосов
/ 20 декабря 2010

Я использую DLL-камеру камеры безопасности для получения изображения с камеры.DLL вызывает функцию моей программы, передавая буфер изображения в качестве параметра, но изображение имеет формат yuy2.Мне нужно преобразовать этот буфер в RGB, но я попробовал каждую формулу, которую нашел в Интернете, но безуспешно.Каждый пример, который я пробовал (включая http://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx#yuvformats_2), дает неправильные цвета.

Я могу преобразовать буфер в черно-белое изображение, используя только компонент Y пикселя, но мне действительно нужен цветЯ отладил (только сборка) DLL, которая показывает изображение на экране, и использует DirectDraw для этого.

Ответы [ 4 ]

11 голосов
/ 21 декабря 2010

Использование информации из ссылки Microsoft в вопросе:

for (int i = 0;  i < width/2;  ++i)
{
    int y0 = ptrIn[0];
    int u0 = ptrIn[1];
    int y1 = ptrIn[2];
    int v0 = ptrIn[3];
    ptrIn += 4;
    int c = y0 - 16;
    int d = u0 - 128;
    int e = v0 - 128;
    ptrOut[0] = clip(( 298 * c + 516 * d + 128) >> 8); // blue
    ptrOut[1] = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8); // green
    ptrOut[2] = clip(( 298 * c + 409 * e + 128) >> 8); // red
    c = y1 - 16;
    ptrOut[3] = clip(( 298 * c + 516 * d + 128) >> 8); // blue
    ptrOut[4] = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8); // green
    ptrOut[5] = clip(( 298 * c + 409 * e + 128) >> 8); // red
    ptrOut += 6;
}
2 голосов
/ 30 декабря 2010

Эта формула сработала:

int C = luma - 16;
int D = cr - 128;
int E = cb - 128;
r = (298*C+409*E+128)/256;
g = (298*C-100*D-208*E+128)/256;
b = (298*C+516*D+128)/256;

Я получил это из примера с Matlab.

Вот что: в памяти растровые изображения Windows - это не RGB, а BGR Если вы пишете в буфер памяти, вам нужно сделать что-то вроде этого:

rgbbuffer[rgbindex] = (char)b;
rgbbuffer[rgbindex + 1] = (char)g;
rgbbuffer[rgbindex + 2] = (char)r;
1 голос
/ 20 декабря 2010

Если вы уже использовали DirectShow для получения видеоданных с камеры видеонаблюдения, то вы можете просто добавить « Фильтр преобразователя цветового пространства » на график DirectShow.Но если вы еще не используете DirectShow (звучит так, как будто вы не), то гораздо проще будет преобразовать данные в RGB самостоятельно, используя формулы, с которыми связался Даниэль.Добавление DirectShow в проект очень сложно.

0 голосов
/ 20 декабря 2010

Вам придется написать свой собственный конвертер. GDI + не знает, как обращаться с битовыми картами YUY2.

Смотрите здесь .

Обратите внимание, что 2 пикселя имеют одинаковые значения цвета и имеют разные значения яркости.

Здесь - это некоторые формулы, которые помогут вам написать конвертер.

...