如何使用Magick ++将YUYV转换为RGB?

时间:2016-07-28 08:32:51

标签: c++ imagemagick yuv magick++

通过V4L2从设备读取图像。图像采用YUV 4:2:2格式,又名V4L2_PIX_FMT_YUYV,又称YUY2。

我想要做的是将blob的字节转换为RGB,或者更好的方法是如何实例化Magick ++ Image对象并告诉它数据是YUYV而不是RGB24。

这可以轻松完成吗? Magick ++文档很简单,只提供零帮助:http://www.imagemagick.org/api/Magick++/classMagick_1_1Image.html

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

DimChtz的答案是最简单的,因为任务很直接。

ImageMagick支持格式

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

可以通过类似的东西来利用......

 // 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板,并发出功能请求和/或寻求指导。