3

我正在尝试使用 V4L2 API 来捕获图像并将图像放入 opencv Mat 中。问题是我的网络摄像头只在 YUYV (YUY2) 中捕获,所以我需要先转换为 RGB24。这是我正在使用的完整 V4L2代码。

我能够让图片中的物体变得可识别,但它都是粉红色和绿色的,而且它被水平拉伸和扭曲。我尝试了许多不同的转换公式,并且得到了相同的基本粉色/绿色失真图像。这张图片使用的公式来自http://paulbourke.net/dataformats/yuv/。我正在使用 linux 上的 shotwell 照片查看器来查看 .raw 图像。我无法打开它。我对如何保存图像格式不是很了解,但我假设必须有某种标题,但 shotwell 照片查看器似乎可以工作。这可能是图像不正确的原因吗?

我不确定 V4l2 是否返回 p 指向的有符号或无符号字节图像。但如果这是问题,我的图像不会只是颜色变差吗?但似乎几何图形也被扭曲了。我相信我正确地处理了浮点数的转换。

有人可以帮我理解吗

  1. 如何找出 *void p 变量中包含的基础类型
  2. 从 YUYV 转换为 RGB24 的正确公式,包括使用哪种类型的说明
  3. 保存没有格式(标题)的图像并使用 Shotwell 查看会是问题吗?
  4. 有没有一种简单的方法可以正确保存 RGB24 图像。
  5. 一般调试提示

谢谢

static unsigned char   *bgr_image;

static void process_image(void *p, int size)
{
    frame_number++;
    char filename[15];
    sprintf(filename, "frame-%d.raw", frame_number);
    FILE *fp=fopen(filename,"wb");

    int i;
    float y1, y2, u, v;
    char * bgr_p = bgr_image;
    unsigned char * p_tmp = (unsigned char *) p;

    for (i=0; i < size; i+=4) {

      y1 = p_tmp[i];
      u = p_tmp[i+1];
      y2 = p_tmp[i+2];
      v = p_tmp[i+3];

      bgr_p[0] = (y1 + 1.371*(u - 128.0));
      bgr_p[1] = (y1 - 0.698*(u - 128.0) - 0.336*(v - 128.0));
      bgr_p[2] = (y1 + 1.732*(v - 128.0));
      bgr_p[3] = (y2 + 1.371*(v - 128.0));
      bgr_p[4] = (y2 - 0.698*(v - 128.0) - 0.336*(u - 128.0));
      bgr_p[5] = (y2 + 1.732*(u - 128.0));

      bgr_p+=6;
    }

    fwrite(bgr_image, size, 1, fp);                                       
    fflush(fp);
    fclose(fp);
}
4

2 回答 2

2

首先,您必须了解您使用的是哪种类型的 YUV422。

PIX_FMT_YUYV422,   ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
PIX_FMT_UYVY422,   ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1

尝试相应地替换 y1、u、y2 和 v,但您可能根本不处理 YUV422,图片可能是平面的,而不是您期望的打包格式?

我认为您最好下载 IrfanViewer,它具有原始 yuv 文件打开功能,并尝试选择正确的值以获得正确解码的图像,以查找您使用的数据类型。

于 2013-06-11T05:41:59.450 回答
1

不要试图重新发明轮子。很多人已经编写了色彩空间转换器,并且您的实现(即使它有效)不是“最佳”的可能性很高(例如比必要的慢)。

处理任何颜色空间的 V4L2 设备的规范方法是使用libv4l -library,它将透明地将相机本机颜色空间转换为一次BGR24RGB24并且YUV420(如果您愿意,我认为这是真的)。

至于保存图像,再次使用已经存在的图像。就个人而言,我会使用imagemagick将帧保存为“正确”的格式,任何图像查看器都可以读取该格式(png 或 tiff,如果质量很重要)

于 2013-06-13T09:41:08.280 回答