2010-05-25 20 views
16

La formule dit:Comment traiter RVB à 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; 

Et si, par exemple, la variable U devient négative?

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

On suppose des valeurs maximales pour R et G (les) et B = 0 Donc, je suis intéressé par la mise en œuvre de cette fonction Convetion dans OpenCV, Alors, comment faire face à des valeurs négatives? Utilisation de l'image flottante? de toute façon s'il vous plaît expliquez-moi, peut être je ne comprends pas quelque chose ..

Répondre

13

Vous pouvez convertir RVB < -> YUV en OpenCV avec cvtColor en utilisant la codeCV_YCrCb2RGB pour YUV-> RGB et CV_RGBYCrCb pour RVB-> YUV.

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

convertit une image d'un espace colorimétrique à l'autre.

+0

Merci !! J'ai cherché une telle fonction et j'ai pensé que YCrCb est quelque chose de différent de YUV ... – maximus

+0

Pas de problème. Notez que vous pouvez également convertir des images à 3 canaux. Si vous avez besoin de fusionner les composants Y, U et V, vous pouvez le faire avec 'merge' qui prend un objet' vector '. – Jacob

+3

@maximus - à strictement parler c'est. YUV est pour la norme de télévision analogique YCrCb est numérique - l'espace de couleur est différent. Mais seulement très légèrement –

14

Y, U et V sont tous autorisés à être négatif lorsqu'il est représenté par des décimales, selon le YUV color plane.

YUV Color space

2

pour les formats planaires OpenCV n'est pas le bon outil pour le travail. Au lieu de cela, vous feriez mieux d'utiliser ffmpeg. par exemple

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

vous permet de convertir une image YUV420 à RGB32

+0

Approche intéressante :) – maximus

+0

Sujet de départ demandé à propos de RGB à YUV. .. – JavaRunner