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 de l'espace couleur et vitesse d'acquisition


Sujet :

OpenCV

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut Conversion de l'espace couleur et vitesse d'acquisition
    Bonjour,

    Je suis étudiant et doit réaliser un projet a l'aide de la bibli OpenCv, je suis tombé sur ce pdf et pas mal d'autre code parlant de plus ou moins la même chose:
    http://wcours.gel.ulaval.ca/2008/a/2...arlesA2006.ppt

    J'aurai aimé avoir quelques précisions sur ce code :

    Parcourir l'image HSV et vérifier les seuils (suite)
    //test minS (=100)
    (hsvFrame->imageData + hsvFrame->widthStep*y)[(x*3)+1] >100
    )
    //…placer un point blanc dans l'image « seuils ».
    ( seuilFrame->imageData + seuilFrame->widthStep*y)[x] = 255;
    //Sinon, placer un point noir.
    else
    ( seuilFrame->imageData + seuilFrame->widthStep*y)[x] = 0;
    }
    } //fin des boucles
    En effet après étude de la doc si j'ai bien compris on accede au pixel par la fonction : cvGet2D(Iplimage, y, x);
    Or pour modifier des valeurs des pixels il utilise un code de ce type :

    for( i=0; i<width; i++)
    (imga->imageData + 2*imga->widthStep)[i] =
    (uchar)7;
    J'aimerai comprendre ce que signifie ces lignes de codes, on additionne deux champs de l'iplimage et on l'utilise comme si c'était un tableau a une dimension ???

    Pour notre projet nous devons detecter un cercle de couleur sur le flux video d'une webcam. Nous devons donc convertir l'espace couleur (RGB -> HSV) et parcourir le premier champ ( H ) correspondant au code de couleur d'après nos recherches pour trouver la couleur qui nous interresse. Nous avons aussi une question par rapport a cela, pourquoi convertir l'espace couleur et ne pas travailler sur du RGB directement, je suppose que c'est plus simple ? mais au final en temps de travail ce n'est pas plus rapide de travailler directement sur du RGB même si c'est plus compliquer ?

    Enfin nous arrivons a recuperer le lfux de la webcam mais nous ne trouvons rien nous permettant de regler le nombre d'image par seconde a traiter, quelqu'un aurai une idée d'une fonction opencv nous y aidant ou une façon de proceder pour regler ce problème ?

    Donc voila, merci d'avance, Arthur

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut, et bienvenue sur Developpez.com

    Tu as pas mal de question ! Je ne saurai pas répondre à toutes.

    Tout d'abord, l'intérêt du HSV :
    Si tu connais la représentation du HSV, l "essence de la couleur" est déterminée par la valeur H. Ansi, tu n'as qu'à tester si le H vaut entre x et y, et tu sauras si c'est la bonne couleur, sans grand souci de la luminosité.
    Alors qu'en RGB, il est bien plus difficile de cerner les valeurs extremes d'une couleur, on ne peut d'ailleurs pas vraiment le faire, car la variation de la luminosité, quand ne peut pas réellement calculée, rend la chose très difficile. Alors qu'en HSV, la luminosité est facilement mesurable.

    Quelques infos sur le code :

    Voici une représentation simplifié de ton image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p1   p2   p3   p4   p5   p6
     
    p7   p8   p9  p10  p11  p12
     
    p13  p14  p15  p16  p17   p18
    où px est un pixel, contenant chacun une valeur pour H, S et V.

    Te renvoit un pointeur sur le début des données de l'image organisée de façon linéaire. En gros, ca te rend un tableau, contenant toutes les données organisées ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rang :                      0         1         2          3        4   .....   53
    val correspondante:         p1.H    p1.S      p1.V     p2.H     p2.S     ...  p18.V
    Tu as donc toutes les valeurs que tu veux, qu'il faut accéder en changeant l'index. Ensuite te renvoit la taille de tableau correspondant à une ligne de ton image. Dans mon image symbolique précédente, widthStep = 6 x 3 = 18. En gros, faire imageData+widthstep correspond à "un saut de ligne" dans l'image.
    Dans mon cas, ça m'emmenera au rang 17, qui correspondra à p7.H .

    Le code que tu as cité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for( y = 0;y <image->height;y++)//parcours des lignes
    {
      for(x=0;x<image->width;x++)//parcours des pixels
      {
        if((hsvFrame->imageData + hsvFrame->widthStep*y)[(x*3)+1] >100)
         {//on pointe le pixel, on fait "+1" pour avoir la valeur S, et on teste si elle est plus grande que 100 (couleur assez saturée, donc assez vive et non blanche/noire)
          ...
         }
      }
    }
    J'éspère vous avoir éclairé ( que j'ai augmenté votre V )

    G.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut
    Ok merci beaucoup pour tes réponses c'est deja beaucoup plus claire même très claire.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut
    J'ai encore un petit problème.

    Avant j'utilisais un code de ce type :
    int ncams = cvcamGetCamerasCount( );
    cvcamSetProperty(0, CVCAM_PROP_ENABLE , CVCAMTRUE);
    cvcamSetProperty(0, CVCAM_PROP_CALLBACK ,(void *)callback);
    Mais n'arrivant pas a regler la vitesse d'acquisition je suis passé par une autre méthode :

    IplImage* frame=cvQueryFrame(capture);
    ou encore celle la :

    cvGrabFrame( capture );
    Sauf qu'avec ces deux nouvelles méthodes même si la vitesse d'acquisition est meilleur je n'arrive pas a travailler sur du HSV. Je suppose que cette méthode recuperer par defaut du RGB donc j'essaye de la convertir :

    IplImage* frame=cvQueryFrame(capture);
    cvShowImage("Capture Webcam",frame);
    //IplImage* img_nvg = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U ,3 );
    IplImage *img_nvg=cvCloneImage(frame);
    cvCvtColor(frame, img_nvg, CV_BGR2HSV );
    Mais voila par cette méthode l'image cloné et convertie a des couleurs foireuses.. et si j'utilise directement un CreateImage comme mis en commentaire même resultat et en plus l'image est a l'envers.
    Quelqu'un aurai une idée du pourquoi les couleurs ne sont pas celle d'origine ?

    Pendant ce temps je vais essayer une autre méthode que j'ai trouvé sur laquelle je peux regler la vitesse d'acquisition en plus...

    cvCreateCameraCapture
    Je comprends pas pourquoi il y a autant de fonction faisant casiment ou presque la même chose dans opencv héhé

    Merci d'avance, Arthur...

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    J" nai encore jamais utilisé le HSV avec openCV. Je vais regarder, et je te donnerai des nouvelles bientôt.

    Sinon, pour ton inistialisation de webcam, en effet cvcam est un peu dépasée, quoique présente toujours des fonctionnalités intéressantes. Mais utilise plutot les fonctions de "highgui" : la doc

    G.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Alors j'ai testé, en effet, il ya un problème à l'affichage. Hors en reconvertissant l'image HSV en BGR, l'affichage se fait correctement. Donc la conversion est juste, et c'est l'affichage qui gère mal le hsv. J'ai vérifié la doc, et en effet, dans la description de cvShowImage :
    A color image is assumed to have data in BGR order.
    Je n'ai pas cherché comment afficher une HSV, mais tu sais déjà ou est le probleme ! Et après tout, tu peux faire ton traitement, et une fois terminé, tu reconvertis en BGR et tu affiches. Ce n'est pas très grave.

    G.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Bonjour,

    à ma connaissance on ne peut pas afficher une image en HSV (ou l'enregistrer d'ailleurs) avec OpenCv. Mais ceci dans le sens où, si tu veux visualiser ton image en couleurs "réelles", tu dois la reconvertire en BGR avant. Afficher (au format BGR donc), une image en HSV te donnera, comme tu dis des couleurs foireuses, mais en réalité cela peut être utile pour observer certaines choses. Ce qu'il faut savoir à ce moment là c'est que le bleu (Blue) représentera la couleur (le Hue), le vert (Green) la saturation et le rouge (Red) la value.
    Si tu ne visualise pas bien comment fonctionne le HSV tape HSV color dans google image, ca aide pas mal pour se représenter les différentes composantes.

    Vincent

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut
    Merci beaucoup pour vos réponses.

    Alors oui en effet le problème était bête, cvshowimage ne gère pas le hsv. On a pas mal avancé. J'arrive a peu prêt a détecter des cercles sur mon flux video et a suivre son mouvement.

    Coté couleur c'est un peu plus chaotique. dès que la lumière change on détecte plus ce qu'il faut. Chose étrange aussi même après conversion en HSV, le champ "ColorModel" de mon IplImage converti reste "Mode RGB".

    En tout cas bref le HSV est censé justement aider a la détection de couleur dans le cas ou la luminosité change mais ou bien on est pas doué ou bien c'est pas beaucoup plus efficace sur le RGB.

    Autre chose j'ai beau avoir converti en RGB mes valeurs pour H S V sont entre 0 et 255 alors que sur des logiciels de calibrages c'est 360 100 100 c'est super pas pratique...

    Enfin si quelqu'un pourrai me détailler la fonction cvHoughCircles, je ne suis pas sure de bien comprendre les paramètres et ceci malgré la doc. Par exemple sur :

    CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 100, 50 );

    J'aurai aimé avoir la signification des trois derniers paramètres.
    gray->height/4 : C'est la distance minimum entre deux cercles détectés je crois ?
    100 et 50 d'après mes tests c'est en rapport avec la taille ?

    Merci d'avance, Arthur.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut
    Au passage si quelqu'un connait un tuto pour installer la librairie sur freebsd ca serai genial. on a essayer de l'installer sur une becane sous freebsd la a partir de l'installateur linux de sourceforge et a part beaucoup de message d'erreur on a pas grand chose, et sur le net rien freebsd + opencv donne rien mise a part des sites sur la redaction de lettre de motivation hehe.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Salut,

    concernant les paramètres de cvHoughCircles, normalement il y en a deux de plus.

    Le cinquième spécifie la distance minimale entre 2 cercles détectés. Si elle est trop petite plusieurs cercles pourront être détectés très proches les uns des autres et en fait correspondront au même cercle réel.

    Le sixième est le seuil haut du detecteur de Cany utilisé par la fonction pour faire une détection de contours. Pour en savoir plus regarde des choses sur Canny et tu peux même tester ces seuils grâce à la fonction cvCanny.

    Le septième correspond au seuil de détection de la fonction de Hough. Comme tu as du le voir, celle-ci remplie un tableau correspondant, plus ou moins, à la probabilité q'un cercle passant par le point de coordonnés x,y. A la fin, la fonction sélectionne les points x,y qui ont une probabilité suffisament forte (supérieure au seuil) et considère qu'il y'a un cercle en ce point. Plus il sera bas, plus tu auras de fausses alarmes.

    Les 8ème et 9ème paramètres représentent la taille minimale et la taille maximale des cercles qui seront finalement conservés par la fonction. Si tu les règles correctement tu pourras là aussi supprimer un certain nombre de fausses alarmes.

    Pour l'histoire de la luminosité qui fait changer tes valeurs HSV, il ne te faut regarder que le H lorsque le produit S*V est supérieur à un certain seuil à déterminer (c'est souvent comme cela que l'on fait). Mais si tu as un éclairage qui n'est pas blanc, tout changement de celui-ci va modifier les couleurs et donc biaiser la détection...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 27
    Par défaut
    en faites on a réussi a contourner le problème de lumière, on détecte nos cercles sur l'image capturé par la webcam telle qu'elle, juste un petit flou gaussien leger. Ensuite on parcours les pixels du cercle avec une petite fonction très simple a coder pour faire la moyenne des couleurs de pixel du cercle et savoir de quelle couleur est le cercle.

    Ainsi nos gomettes sont détectées, et on sait de quelle couleur elles sont.

    Quand on voit le temps passer la dessus et le peu de ligne de code, c'est presque un jeu d'enfant au final quand on voit ce que fait le programme. Merci a tous pour vos réponses en tout cas ça nous a bien aidé.

    Plus qu'a optimisé tout ça en essayant d'integrer des ROI par rapport aux dernières positions de gomettes détectés et ça sera parfait.

  12. #12
    Invité de passage
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Par défaut aide
    Salut,

    Moi, je cherche à repérer un cercle blanc sur un fond noir (après une binarisation de mon image), mais surtout récupérer les coordonnées du cercle. Donc pour cela, j'utilise la fonction houghcircles, mais bon, j'ai une erreur!!
    voila mon bout de code:

    CvMat* storage;

    //Récupérer les cercles blancs de notre images
    CvSeq* circles= cvHoughCircles(img_bin,storage,CV_HOUGH_GRADIENT,1,5);

    //On récupère les coordonnées du centre du cercle
    double x=cvmGet(storage,0,0);
    double y=cvmGet(storage,0,0);

    Voila, je précise que imb_bin correspond àà mon image binarisée ,donc de type : "IplImage *img_bin;"

    Voila, ça serait super cool si vous pouviez m'aider!!
    Et je vous en remercie d'avance.

  13. #13
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    normal tu as oublie ca ; storage = cvCreateMemStorage(0);

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

Discussions similaires

  1. Conversion PDF -> Word: espacements perdus
    Par apokrif dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 10/04/2015, 00h17
  2. Conversion vers l'espace LMS
    Par asma07 dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 28/03/2012, 14h06
  3. Passage vers l'espace couleur LUV
    Par abir2007gallas dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 12/01/2012, 11h33
  4. Conversion de l'espace RGB vers RGB normalisé
    Par hanane78 dans le forum Images
    Réponses: 5
    Dernier message: 16/08/2007, 13h38
  5. Algorithme qui détermine un espace couleur hybride
    Par hanane78 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/02/2007, 18h15

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