【问题标题】:V4L2_PIX_FMT_YUYV: convert from YUYV to RGB24?V4L2_PIX_FMT_YUYV:从 YUYV 转换为 RGB24?
【发布时间】:2013-04-23 18:19:12
【问题描述】:

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

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

所以我现在很困惑:如何将 V4L2_PIX_FMT_YUYV 位图转换为真正的 RGB24?有没有例子?

【问题讨论】:

    标签: linux rgb yuv v4l2 image-conversion


    【解决方案1】:

    评论太长了...

    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

    有关 rgb/yuv 转换的正确公式,另请参阅 http://www.fourcc.org/fccyvrgb.php

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

    【讨论】:

    • 您的 yuv-viewer 无法针对最新的 SDL 进行编译。 :(
    • 这是意料之中的,因为我的查看器基于 SDL1.2。我确实有一个更简单的版本,可以在 SDL2.0 上运行,但还没有将它推送到 github
    【解决方案2】:

    我遇到了类似的问题,问题是字节顺序。 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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-23
      • 2022-01-26
      • 2011-01-02
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多