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 :

Transformée de Hough


Sujet :

OpenCV

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut Transformée de Hough
    Bonjour,

    j'essaye de réaliser une transformée de Hough pour détecter les droites sur une image.

    J'ai d'abord opté pour la bibliothèque CImg, facile à installer.
    Cependant, l'implémentation de la transformée de Hough donne le résultat suivant: on obtient le domaine de Hough et on doit nous même cliquer sur les maximums locaux pour pouvoir afficher les droites correspondantes sur l'image.

    J'aimerais savoir si, dans openCV, l'implémentation de la transformée de Hough comprend cette recherche de maximas locaux automatiquement et comprend l'affichage direct des droites les plus significatives sur l'image.

    Si des gens ont déjà utilisé cette fonction, je serais intéressé par des infos.

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20
    Par défaut
    Salut

    Il faut d'abord faire un cvCanny()
    La fonction cvHoughlines2()

    La fonction cvHoughlines2() est bien décrite sur le wiki d'opencv.
    Je ai utilisé des parties de l'exemple mais il me manque un algorithme pour detecter uniquement les lignes qui m'interessent.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut
    Mais il détecte quand même relativement bien les droites principales de ta photo?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20
    Par défaut
    Oui il me reste à bien le regler (CV_STANDARD ou CV_PROBALISTIC)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut
    Franchement pas mal du tout!
    J'ai trouvé ce code sur le wiki de openCV:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    /* This is a standalone program. Pass an image name as a first parameter of the program.
       Switch between standard and probabilistic Hough transform by changing "#if 1" to "#if 0" and back */
    #include <cv.h>
    #include <highgui.h>
    #include <math.h>
    
    int main(int argc, char** argv)
    {
        IplImage* src;
        if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0)
        {
            IplImage* dst = cvCreateImage( cvGetSize(src), 8, 1 );
            IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 3 );
            CvMemStorage* storage = cvCreateMemStorage(0);
            CvSeq* lines = 0;
            int i;
            cvCanny( src, dst, 50, 200, 3 );
            cvCvtColor( dst, color_dst, CV_GRAY2BGR );
    #if 1
            lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 );
    
            for( i = 0; i < MIN(lines->total,100); i++ )
            {
                float* line = (float*)cvGetSeqElem(lines,i);
                float rho = line[0];
                float theta = line[1];
                CvPoint pt1, pt2;
                double a = cos(theta), b = sin(theta);
                double x0 = a*rho, y0 = b*rho;
                pt1.x = cvRound(x0 + 1000*(-b));
                pt1.y = cvRound(y0 + 1000*(a));
                pt2.x = cvRound(x0 - 1000*(-b));
                pt2.y = cvRound(y0 - 1000*(a));
                cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8 );
            }
    #else
            lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 );
            for( i = 0; i < lines->total; i++ )
            {
                CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
                cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
            }
    #endif
            cvNamedWindow( "Source", 1 );
            cvShowImage( "Source", src );
    
            cvNamedWindow( "Hough", 1 );
            cvShowImage( "Hough", color_dst );
    
            cvWaitKey(0);
        }
    }

    En rouge dans les commentaires, il disent de mettre le nom de l'image comme premier paramètre du programme mais je n'arrive pas à voir où c'est exactement. Mon path est le suivant: c:/photo1.bmp, où dois-je le placer?

    Merci d'avance

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20
    Par défaut
    Voici la commande
    hough [adresse et nom du fichier] ou ./hough (pour linux) [adresse et nom du fichier]

    C'est quoi ton projet?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut
    Mon projet est de détecter des ponts sur une image aérienne donc d'abord je détecte les droites présentes.
    Mais, en ce qui concerne le code ci-dessus, la fonction cvHoughLines2 est utilisée plus ou moins à la moitié du code.
    Ce code est un exemple tout fait que j'ai trouvé sur le wiki de openCV.
    Ils disent de passer le nom de la photo comme premier paramètre du programme. Mais qu'est ce que c'est le premier paramètre?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20
    Par défaut
    dans une fenetre de commande :
    hough c:/photo1.bmp

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut
    Merci mais mon but serait de faire fonctionner ce code car il correspond bien à ce que je veux faire.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut
    Le premier paramètre, c'est argc ou argv? Ou autre chose?
    J'essaie plein de possibilités et rien ne marche.
    argc est au départ égal à 1 et la condition if est valable si argc=2, il y a quelque chose que je ne comprends pas, où dois-je rajouter le nom de chemin de ma photo?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le premier paramètre c'est argv[1]. argv[0] est toujours le nom ou chemin de l'exécutable.

    Mais tu n'es pas obligé de passer ton image en paramètre si tu ne le souhaites pas, tu peux simplement remplacer argv[1] par "c:/photo1.bmp" dans le code.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 30
    Par défaut
    Merci beaucoup, j'ai rajouté argv[1]="c:/photo1.bmp" mais ca ne marchait tjs pas alors dans le if j'ai mis if argc == 1 au lieu de argc == 2 et ca marche!

    Je ne sais pas pq ils ont écrit argc == 2 au départ...

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne sais pas pq ils ont écrit argc == 2 au départ...
    Parce que pour utiliser le second argument, il faut qu'il y en ait deux...

    j'ai rajouté argv[1]="c:/photo1.bmp"
    Bof. Utilise plutôt une nouvelle variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* filename = "c:/photo1.bmp";
    Et vire toute la gestion des paramètres si tu ne les utilises pas.

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

Discussions similaires

  1. algorithme "Transformée de Hough"
    Par comrad85 dans le forum Traitement d'images
    Réponses: 86
    Dernier message: 25/03/2008, 11h05
  2. Transformée de Hough
    Par firewall dans le forum Images
    Réponses: 3
    Dernier message: 27/09/2007, 16h43
  3. Transformée de Hough
    Par Vincent157 dans le forum OpenCV
    Réponses: 2
    Dernier message: 04/07/2007, 16h20
  4. transformée de Hough généralisée
    Par Bella la vita dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 20/06/2007, 12h28
  5. Detection d'ellipse par la transformée de Hough
    Par oussama127 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 03/05/2006, 08h47

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