Как бороться с преобразованием RGB в YUV - PullRequest
17 голосов
/ 25 мая 2010

Формула гласит:

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 (единиц) и B = 0 Итак, я заинтересован в реализации этой функции конвекции в OpenCV, Итак, как бороться с отрицательными значениями? Использование плавающего изображения? в любом случае, пожалуйста, объясните мне, может быть, я чего-то не понимаю ..

Ответы [ 3 ]

14 голосов
/ 25 мая 2010

Y, U и V разрешены быть отрицательными, если они представлены десятичными знаками, согласно цветовой плоскости YUV .

YUV Color space

13 голосов
/ 25 мая 2010

Вы можете конвертировать RGB <-> YUV в OpenCV с помощью cvtColor , используя code CV_YCrCb2RGB для YUV-> RGB и CV_RGBYCrCb для RGB-> YUV.

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

Преобразует изображение из одного цветового пространства. другому.

2 голосов
/ 03 августа 2013

для плоских форматов 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

...