2010-05-25 50 views
16

La fórmula dice:¿Cómo lidiar con RGB a YUV conversión

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; 

¿Qué pasa si, por ejemplo, la variable T se convierte en negativo?

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

asumir valores máximos de R y G (unos) y B = 0 lo tanto, estoy interesado en implementar esta función Convetion en OpenCV, Entonces, ¿cómo hacer frente a los valores negativos? ¿Usar imagen flotante? de todos modos por favor explícame, puede ser que no entiendo algo ...

Respuesta

13

Puede convertir RGB < -> YUV en OpenCV con cvtColor utilizando el codeCV_YCrCb2RGB para YUV-> RGB y CV_RGBYCrCb de RGB-> YUV.

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

convierte una imagen de un espacio de color a otro .

+0

gracias !! Busqué una función así y pensé que YCrCb es algo diferente a YUV ... – maximus

+0

No hay problema. Tenga en cuenta que también puede convertir imágenes de 3 canales. Si necesita unir los componentes Y, U y V, puede hacerlo con 'merge' que toma un objeto' vector '. – Jacob

+3

@maximus: estrictamente hablando, lo es. YUV es para el estándar de televisión analógica YCrCb es digital: el espacio de color es diferente. Pero solo muy ligeramente –

14

Y, U y V pueden ser negativos cuando están representados por decimales, de acuerdo con YUV color plane.

YUV Color space

2

para formatos planos OpenCV no es la herramienta adecuada para el trabajo. En cambio, es mejor que uses ffmpeg. por ejemplo

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); 
} 

será convertir una imagen a YUV420 RGB32

+0

Enfoque interesante :) – maximus

+0

El iniciador de tema preguntó acerca de RGB a YUV. .. – JavaRunner