使用OpenCV将颜色空间从YUV转换为RGB

6

我正在尝试使用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*吗?我很困惑,非常感谢任何帮助。

请查看以下链接:https://dev59.com/3nE85IYBdhLWcg3wLAUV#2906294 - jbutler483
我已经看过那些帖子,但是我无法按照它们的规定使用。你能指出我的代码问题吗? - d1xlord
@d1xlord,您没有指定您正在处理哪种YUV格式。请查看以下内容以了解有多少种YUV:fourcc.org/yuv.php。您真的想要RGB吗?您已经指定了一个4通道Mat,并且您的函数名为“ConvertYUVtoRGBA”,因此我假设您是指RGBA?或者也许是BGRA? - Bull
@jbutler483 这不应被视为 在OpenCV中将YUV转换为BGR或RGB 的重复。首先,我认为这里的数据格式不同,其次,那个问题的被接受答案,在我看来,也不是最好的方法。 - Bull
1个回答

11

你的问题中没有足够的细节,无法给出确定的答案,但以下是我最好的猜测。我假设你想要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吗?不需要,mrgb是dest的包装器,按照你的方式排列,RGBA数据将直接写入dest缓冲区。

非常感谢。实际上,在创建Mat时,我必须发送&src,否则它无法编译。我还必须将其更改为BGRA(正如您建议的那样),并使用I420而不是NV21。 再次感谢您的答案。 :D - d1xlord
只有当YUV源是SD时,这才能正常工作。通过基本的视觉检查可能看起来正确,但实际上颜色并不正确。不幸的是,这是因为目前最新的OpenCV源(2.4.10)仅支持PAL / NTSC / SECAM的601色彩空间而不支持高清的709或UHD的2020。 - G Huxley
嗨,有点晚了,但是你怎么称呼这个方法?我的源是一个字节数组,还有宽度和高度。我该怎么调用它?非常感谢任何帮助。谢谢。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接