17

公式说:

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 (ones) 的最大值和 B = 0 所以,我有兴趣在 OpenCV 中实现这个对流函数,那么,如何处理负值?使用浮动图像?无论如何请解释我,可能是我不明白的东西..

4

3 回答 3

14

根据YUV 颜色平面,Y、U 和 V 在用小数表示时都允许为负数。

YUV 色彩空间

于 2010-05-25T14:38:11.017 回答
13

您可以使用for YUV->RGB 和for RGB-> YUV 在 OpenCV 中使用cvtColor转换 RGB<-> YUV。code CV_YCrCb2RGBCV_RGBYCrCb

void cvCvtColor(const CvArr* src, CvArr* dst, int code)

将图像从一种颜色空间转换为另一种颜色空间。

于 2010-05-25T15:57:06.330 回答
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

于 2013-08-02T20:44:29.607 回答