1

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

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

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

4

2 回答 2

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-conversion 的正确公式。

如果您需要进一步的帮助,请从那里拿走并给我留言...

于 2013-04-23T19:36:48.183 回答
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;

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

于 2018-10-28T02:00:59.753 回答