V4L2_PIX_FMT_YUYV:从YUYV转换为RGB24?

时间:2013-04-23 18:19:12

标签: linux rgb yuv v4l2 image-conversion

我正在使用Video4Linux2从网络摄像头捕获图像数据。设备返回的像素格式为V4L2_PIX_FMT_YUYV。根据{{​​3}},这与YUV422相同,所以我根据http://linuxtv.org/downloads/v4l-dvb-apis/V4L2-PIX-FMT-YUYV.html的描述使用了YUV422到RGB24的转换。

令人惊讶的是,结果是一张奇怪的紫罗兰色/绿色图片。所以似乎YUYV与YUV422不同(并且还存在像素格式V4L2_PIX_FMT_YUV422P,这是不一样的吗?)。

所以我现在完全糊涂了:如何将V4L2_PIX_FMT_YUYV位图转换为真正的RGB24?那里有什么例子吗?

2 个答案:

答案 0 :(得分:3)

发表评论的时间太长了......

4:2:2不是像素格式,它只是关于如何对色度数据进行二次采样的表示法。根据linuxtv-link,V4L2_PIX_FMT_YUYV与YUYV或YUY2相同。 关于该主题的最终参考是http://www.fourcc.org。在http://www.fourcc.org/yuv.php#YUYV

查看有关YUY2的内容
       Horizontal   Vertical
Y Sample Period 1   1
V Sample Period 2   1
U Sample Period 2   1

要验证输入格式确实是YUYV,您可以使用我使用SDL编写的查看器;本机支持这种格式(以及其他)

https://github.com/figgis/yuv-viewer

另请参阅http://www.fourcc.org/fccyvrgb.php了解rgb / yuv转换的正确公式。

如果你需要进一步的帮助,请从那里拿出评论并发表评论......

答案 1 :(得分:1)

我有一个类似的问题,问题是字节序。 V4L以一系列字节的形式返回像素数据,我将其转换为16位整数。由于计算机的字节顺序,Y和Cb(或Y和Cr表示奇数像素)值被交换了,因此我得到了奇怪的紫色/绿色图像。

解决方案只是改变我从16位整数中提取Y,Cb和Cr的方式。也就是说,代替这个:

int y = pixbuf[i] & 0xFF00) >> 8;
int u = pixbuf[(i / 2) * 2] & 0xFF;
int v = pixbuf[(i / 2) * 2 + 1] & 0xFF;

我应该这样做:

int y = (pixbuf[i] & 0xFF);
int u = (pixbuf[(i / 2) * 2] & 0xFF00) >> 8;
int v = (pixbuf[(i / 2) * 2 + 1] & 0xFF00) >> 8;

或者实际上只是像明智的人一样将它们作为字节序列进行处理...