Как использовать Magick++ для преобразования YUYV в RGB?

Чтение изображений с устройства через V4L2. Изображения имеют формат YUV 4:2:2, он же V4L2_PIX_FMT_YUYV, он же YUY2.

Что я хотел бы сделать, так это либо преобразовать блок байтов в RGB, либо, еще лучше, создать экземпляр объекта изображения Magick ++ и сообщить ему, что данные находятся в YUYV вместо RGB24.

Можно ли это легко сделать? Документация по Magick++ проста и не содержит никакой помощи: http://www.imagemagick.org/api/Magick++/classMagick_1_1Image.html


person Stéphane    schedule 28.07.2016    source источник


Ответы (2)


Вы можете легко преобразовать YUV422 в RGB888. Пусть data будет данными изображения, которые вы загружаете в формате YUV422, тогда:

u  = data[0];
y1 = data[1];
v  = data[2];
y2 = data[3];
...
...

а потом:

rgb[0] = yuv2rgb(y1, u, v);
rgb[1] = yuv2rgb(y2, u, v);
...
...

используя следующую формулу для yuv2rgb:

R = Y + 1.140*V
G = Y - 0.395*U - 0.581*V
B = Y + 2.032*U
person DimChtz    schedule 28.07.2016

Ответ DimChtz будет самым простым, так как задача проста.

ImageMagick поддерживает форматы

     UYVY* rw-   16bit/pixel interleaved YUV
      YUV* rw-   CCIR 601 4:1:1 or 4:2:2

И может быть использован magick++. как...

 // Quickly reorder YUYV to UYVY
 unsigned char y1, u, y2, v;
 for ( int i = 0; i < buffer_length; i+=4 ) {
     y1 = buffer[i  ];
     u  = buffer[i+1];
     y2 = buffer[i+2];
     v  = buffer[i+3];
     buffer[i  ] = u;
     buffer[i+1] = y1;
     buffer[i+2] = v;
     buffer[i+3] = y2;
 }
 Magick::Image image;
 Magick::Blob blob( buffer, buffer_length );
 image.size("176x144");
 image.magick("UYVY");
 image.read(blob);
 // ... etc ...

Я предлагаю перейти на доску ImageMagick ImageMagick Program Interfaces и отправьте запрос функции и/или обратитесь за советом.

person emcconville    schedule 28.07.2016
comment
Потрясающий ответ. Как вы получили 2 строки текста после того, как ImageMagick поддерживает форматы? Является ли это частью вывода инструмента? - person Stéphane; 28.07.2016
comment
Да сэр. Это из утилиты идентификации IM. identify -list format - person emcconville; 28.07.2016
comment
Хм. Должно быть для более новых версий. Я использую magick++6.q16-5 на Debian (устройство ARM7), и этого не существует: $ определить -формат списка -bash: определить: команда не найдена - person Stéphane; 28.07.2016
comment
Я ожидал, что утилита identity будет включена в пакет imagemagick-6.q16 , но, возможно, вы установили только библиотеку magick++. - person emcconville; 29.07.2016