2010-05-25 2 views
16

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

ответ

13

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

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

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

+0

Спасибо !! Я искал такую ​​функцию, и я подумал, что YCrCb - это нечто иное, чем YUV ... – maximus

+0

Нет проблем. Обратите внимание, что вы также можете конвертировать 3-канальные изображения. Если вам нужно объединить Y, U и Vcomponents, вы можете сделать это с помощью 'merge', который принимает объект' vector '. – Jacob

+3

@maximus - строго говоря. YUV для аналогового ТВ стандарта YCrCb является цифровым - цветовое пространство отличается. Но только очень немного –

14

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

YUV Color space

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

+0

Интересный подход :) – maximus

+0

Тема starter спросила о RGB YUV. .. – JavaRunner