IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Conversion RVB vers et depuis YUV


Sujet :

OpenCV

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Conversion RVB vers et depuis YUV
    Bonjour,

    J'aimerai effectuer la conversion d'une image RGB vers une image YUV, en utilisant la librairie openCV.

    Je possède l'image suivante : http://www.hannibalcsd.org/teacherwe...mples/lena.jpg

    Et je lui applique le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
      IplImage *img2=cvLoadImage("lena.jpg");
      IplImage *img3=cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
     
     
      // boucle de conversion rgb vers yuv
     
      int i;
      for (i = 2; i < img2->imageSize; i+=3)
        img3->imageData[i-2] = (0.299*img2->imageData[i-2] + 0.587*img2->imageData[i-1] + 0.114*img2->imageData[i]);
    	img3->imageData[i-1] = -0.147*img2->imageData[i-2] - 0.289*img2->imageData[i-1] + 0.436*img2->imageData[i];
    	img3->imageData[i]	 = 0.615*img2->imageData[i-2] - 0.515*img2->imageData[i-1] - 0.100*img2->imageData[i];
     
    */
    // a visualization window is created with title 'image'
      cvNamedWindow("image RGB",1);
      cvNamedWindow("image YUV",1);
     
    // img is shown in 'image' window
      cvShowImage ("image RGB", img2);
      cvShowImage ("image YUV",img3);
     
    //wait for a keyboard event
      cvWaitKey(0)
     
    return(0);
    Le problème, c'est que ça ne marche pas, quand j'affiche l'image convertie en YUV, j'imagine qu'elle devrait ressembler à l'originale, mais elle est devenue très bleue, comme si j'avais forcé sur le bleu...

    J'ai lu ensuite que openCV chargait les images au format BGR, j'ai testé en modifiant mon algorithme en conséquence, cette fois ci, image très rouge...

    j'ai vérifié l'algorithme sur wikipédia, et c'est le bon. Le problème est plus fondamentale, y'a des trucs de bases qui doivent m'échapper


    Déjà : ma photo de base est elle réellement en RGB ? y'a t'il une différrence entre espace des couleurs (yuv, rgb etc.) et format du fichier (jpg,png etc.)

    Est ce qu'un jpeg est forcément en rgb ? ou alors un jpeg peut être en ce qu'il veut.

    Et quand openCV affiche une image avec cvImageShow, comment il sait qu'elle espace de couleur j'ai utilisé ? Il y a un champ dans IplImage pour le préciser ? Moi j'ai pas trouvé!

    Bref, pour être sur que mon algorithme n'est pas en cause, j'ai essayé ça aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cvCvtColor(img2, img3, CV_BGR2Luv);
    Et c'est toujours aussi dégueulasse !
    Pourtant, cvCvtColor convertit correctement lui !

    En même temps c'est vrai que je sais pas à quoi est censé ressemblé du Luv, mais ça avait l'air proche du Yuv de ce que j'ai compris.

    Voilà, si quelqu'un pouvait m'aider à comprendre toutes ces questions pour que je puisse convertir du RGB en YUV et inversement, je lui en serait très reconnaissant !

    Merci de m'avoir lu.

  2. #2
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bon j'ai trouvé la solution finalement, merci aux cours et tutoriels C++ et à la FAQ C++


    Rappel du problème :
    On a une image, on veut la convertir en YUV de 2 façons : manuellement d'une part, pour implémenter l'algorithme et avec les fonctions de conversions qui existent d'autre part.


    Déjà, au lieu de travailler sur la mémoire directement, il vaut mieux travailler avec les pixels, des fonctions existent : cvGet2D cvSet2D, ...

    Ensuite,

    Premier problème :
    Pour que les couleurs soient affichées correctement, il faut que les valeurs des octets soient positifs, alors on ne fait pas de cast (unsigned) ou de fonction valeur absolue, mais pour les canaux U et V du YUV, (ou Cr et Cb) on rajoute 128.

    ça c'était pour l'implémentation manuelle de l'algorithme.

    Avec les fonctions qui existent déjà : cvcvtcolor, il faut faire attention à ceci :

    OpenCv lit en BGR, et quand il convertit en YUV, il convertit en réalité en VUY ... donc il faut faire un


    cvCvtColor ( img_source, img_dest, cv_cvt_swap_rb) en plus de la conversion en YUV YCrCb plutôt...

    Voilà,

    Problème résolu pour moi en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion exécution commande DOS depuis MS SQL Server vers MySQL
    Par Valarauko dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 20/05/2012, 15h06
  2. Conversion Unix vers DOS...
    Par nicosfly dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2008, 17h53
  3. conversion Access vers SQL
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/03/2004, 13h57
  4. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05
  5. Conversion Timestamp vers varchar
    Par stejutt dans le forum SQL
    Réponses: 4
    Dernier message: 08/01/2004, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo