2010-05-25 20 views
16

La formula dice:Come trattare con conversione da RGB a 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; 

Che cosa succede se, per esempio, la variabile U diventa negativo?

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

assumere valori massimi per R e G (quelli) e B = 0 Quindi, io sono interessato a implementare questa funzione convetion in OpenCV, Così, come trattare con valori negativi? Utilizzo dell'immagine float? comunque per favore spiegami, potrebbe essere che non capisco qualcosa ..

risposta

13

È possibile convertire RGB < -> YUV in OpenCV con cvtColor utilizzando il codeCV_YCrCb2RGB per YUV-> RGB e CV_RGBYCrCb per RGB-> YUV.

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

converte un'immagine da uno spazio colore all'altro.

+0

Grazie !! Ho cercato una funzione del genere e ho pensato che lo YCrCb sia qualcosa di diverso da YUV ... – maximus

+0

Nessun problema. Nota che puoi convertire anche le immagini a 3 canali. Se hai bisogno di unire Y, U e Vcomponents, puoi farlo con 'merge' che prende un oggetto' vector '. – Jacob

+3

@maximus - in senso stretto lo è. YUV è per lo standard TV analogico YCrCb è digitale - lo spazio cromatico è diverso. Ma solo leggermente –

14

Y, U e V possono essere tutti negativi se rappresentati da decimali, secondo lo YUV color plane.

YUV Color space

2

per formati planari OpenCV non è lo strumento giusto per il lavoro. Invece stai meglio usando ffmpeg. per esempio

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

convertirà un'immagine YUV420 a RGB32

+0

Approccio interessante :) – maximus

+0

L'argomento di partenza è stato chiesto su RGB a YUV. .. – JavaRunner

Problemi correlati