【问题标题】:Converting from YUV colour space to RGB using OpenCV使用 OpenCV 从 YUV 颜色空间转换为 RGB
【发布时间】:2014-09-04 12:55:54
【问题描述】:

我正在尝试使用 OpenCV 将 YUV 图像转换为 RGB。我在这方面完全是新手。我创建了一个函数,它将 YUV 图像作为源并将其转换为 RGB。是这样的:

void ConvertYUVtoRGBA(const unsigned char *src, unsigned char *dest, int width, int height)
{
    cv::Mat myuv(height + height/2, width, CV_8UC1, &src);
    cv::Mat mrgb(height, width, CV_8UC4, &dest);

    cv::cvtColor(myuv, mrgb, CV_YCrCb2RGB);
    return;
}

这应该有效吗?我需要再次将 Mat 转换为 char* 吗?我很茫然,任何帮助将不胜感激。

【问题讨论】:

  • 我已经看过这些帖子,但我无法使用它们的指定方式。您能指出我的代码存在的问题吗?
  • @d1xlord 你没有指定你正在处理的 YUV 格式。看看下面有多少个 YUV:fourcc.org/yuv.php。你真的想要 RGB,你已经指定了一个 4 通道 Mat 并且你的函数被称为 ConvertYUVtoRGBA 所以我假设你的意思是 RGBA?或者也许是 BGRA?
  • @jbutler483 这不应被视为与Converting YUV into BGR or RGB in OpenCV 的重复。首先,我认为这里的数据格式不同,其次,这个问题的公认答案是,imo,无论如何都不是最好的方法。

标签: opencv image-processing rgb yuv


【解决方案1】:

您的问题没有足够的细节来给出确定的答案,但以下是我的最佳猜测。我假设您想要 RGBA 输出(不是 RGB、BGR 或 BGRA)并且您的 YUV 是 yuv420sp(因为这是来自 Android 相机的输出,并且与您的 Mat 尺寸一致)

void ConvertYUVtoRGBA(const unsigned char *src, unsigned char *dest, int width, int height)
{
    //cv::Mat myuv(height + height/2, width, CV_8UC1, &src);
    cv::Mat myuv(height + height/2, width, CV_8UC1, src); // pass buffer pointer, not its address
    //cv::Mat mrgb(height, width, CV_8UC4, &dest);
    cv::Mat mrgb(height, width, CV_8UC4, dest);

    //cv::cvtColor(myuv, mrgb, CV_YCrCb2RGB);
    cv::cvtColor(myuv, mrgb, CV_YUV2RGBA_NV21);  // are you sure you don't want BGRA?
    return;
}

我是否需要再次将 Mat 转换为 char?*

不,Mat mrgb 是 dest 的包装器,按照您的排列方式,RGBA 数据将直接写入 dest 缓冲区。

【讨论】:

  • 非常感谢。实际上我必须在创建 Mat 时发送 &src,否则它不会编译。我还必须更改它 BGRA(如您所建议的)并使用 I420 而不是 NV21。非常感谢您再次回答。 :D
  • 这只有在 YUV 源是 SD 时才能正常工作。通过基本的视觉检查,它可能看起来正确,但颜色实际上并不正确。不幸的是,这是因为目前用于 YUV 转换的最新 OpenCV 源 (2.4.10) 仅支持 PAL/NTSC/SECAM 的 601 色彩空间,而不支持 HD 的 709 或 UHD 的 2020。
  • 嗨,有点晚了,你怎么称呼这个方法?我有一个字节数组作为 src,宽度和高度。我怎么称呼它?我将不胜感激任何帮助。谢谢
猜你喜欢
  • 2023-03-14
  • 2018-06-15
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2019-01-25
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多