如何处理RGB到YUV的转换

时间:2010-05-25 14:30:14

标签: image-processing opencv yuv

公式说:

Y = 0.299 * R + 0.587 * G + 0.114 * B;

U = -0.14713 * R - 0.28886 * G + 0.436 * B;

V = 0.615 * R - 0.51499 * G - 0.10001 * B;

例如,如果U变量变为负数怎么办?

U = -0.14713 * R - 0.28886 * G + 0.436 * B;

假设R和G(1)的最大值,B = 0 所以,我有兴趣在OpenCV中实现这个对流功能, 那么,如何处理负值呢? 使用浮动图像?无论如何请解释我,可能是我不明白的东西..

3 个答案:

答案 0 :(得分:14)

根据{{​​3}},

Y,U和V在被小数表示时都被允许为负数。

YUV Color space

答案 1 :(得分:13)

您可以使用code使用CV_YCrCb2RGB CV_RGBYCrCb转换为YUV-> RGB转换OpenCV中的RGB< - > YUV,将void cvCvtColor(const CvArr* src, CvArr* dst, int code) 转换为RGB-> YUV

{{1}}
  

从一个色彩空间转换图像   到另一个。

答案 2 :(得分:2)

对于平面格式,OpenCV不适合这项工作。相反,你最好使用ffmpeg。例如

static void rgbToYuv(byte* src, byte* dst, int width,int height)
{

    byte* src_planes[3] = {src,src + width*height, src+ (width*height*3/2)};
    int src_stride[3] = {width, width / 2, width / 2};
    byte* dest_planes[3] = {dst,NULL,NULL};
    int dest_stride[3] = {width*4,0,0};
    struct SwsContext *img_convert_ctx = sws_getContext(
        width,height,
        PIX_FMT_YUV420P,width,height,PIX_FMT_RGB32,SWS_POINT,NULL,NULL,NULL);
        sws_scale(img_convert_ctx, src_planes,src_stride,0,height,dest_planes,dest_stride); 
    sws_freeContext(img_convert_ctx);
}

将YUV420图像转换为RGB32