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 :

Trouver les meilleures lignes représentatives avec cvHoughLines2


Sujet :

OpenCV

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut Trouver les meilleures lignes représentatives avec cvHoughLines2
    Salut,
    je voudrais savoir si quelqu'un connait une méthode pour trier les séquences de lignes trouvées à la suite du calcul cvHoughLines2(...) ?
    En fait pour être plus clair je cherche à ne garder que les 5 plus représentatives lignes de mon image, voici une partie de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int threshold = cvRound((cvSqrt(surface/CV_PI))/5); // permet d'obtenir un sueil pour ne garder que les "principales" lignes 
    // MAIS ce n'est pas suffisant
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* lines = 0;
    lines = cvHoughLines2(image,storage,CV_HOUGH_STANDARD,1,CV_PI/180,threshold);
    Ce code me renvoit donc une séquence de ligne mais suivant l'image en paramètre je peux avoir de 10 à 40 lignes hors je n'en veux que 5 !!!
    Avez vous une technique pour parcourir cette séquence efficacement tout en triant celles qui m'interessent ?
    Ou sinon est-ce que je peux optimiser la valeur calculée "threshold" pour trier encore plus sur mon image ?

    Merci de vos conseils.
    a+

  2. #2
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    -Faire des filtrages préalable
    -Avoir des critères sur les lignes (taille, orientation etc.)

    Sinon je vois pas
    =>
    OpenCv Addict

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    merci de la suggestion.
    mais en fait voici les images que je manipules, ce sont des squelettes d'objets:



    Le problème est que ces squelettes peuvent varier en taille de façon énorme (certains feront cette taille d'autres quatre fois plus petits,....)
    Ce que je cherche c'est une manière générale qui s'adapte seule pour ne choisir que les axes principaux (ensuite je m'en servirai pour faire une rotation de l'image), donc je ne peux ni privilégier un angle, ni choisir une valeur précise pour savoir la longueur type d'une ligne.
    C'est pourquoi j'avais penser faire par rapport à la surface du masque (voir mon code précédent dans la définition du "threshold") avec lequel j'ai obtenu ce squelette mais le résultat n'est pas brillant...
    Vous auriez une autre idée ??? svp

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    Finalement j'ai réussi à trouver un élément de réponse sur le google groups de OpenCV. La technique ne permet pas une optimisation du temps de calcul mais d'un autre côté ce n'est pas mon objectif premier. Le principe est d'y aller à taton en définissant une valeur du threshold qui augment petit à petit jusqu'à obtenir moins de 8 ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int threshold=15; // valeur déterminer par quelques tests sur mes exemples
    // ne pas définir trop haut au début
    CvSeq* lines = cvHoughLines2(_skel,storage,CV_HOUGH_STANDARD,1,CV_PI/180,threshold);
    while(lines->total > 8) {
    	threshold += 2;
    	lines = cvHoughLines2(_skel,storage,CV_HOUGH_STANDARD,1,CV_PI/180,threshold);
    }
    J'espère que ça pourra en aider quelques uns

  5. #5
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Pas bête mais encore faut t'il que les 8 lignes soit les bonnes
    Bon courage
    =>
    OpenCv Addict

  6. #6
    Membre régulier Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Le problème doit être résolu depuis longtemps mais des fois que ça intéresse ceux qui verront ce sujet.
    Il faut savoir que les lignes retournées par cvHoughLines2 sont déjà classées, c'est-à-dire que la première est la plus représentative, le deuxième la deuxième plus représentative, etc. (avec les paramètres utilisés). Donc, si on ne peut pas se permettre de calculer plusieurs fois la transformée de Hough avec différents paramètres, ça peut être utile de le savoir.

    Exemple pour les dix "plus grandes" lignes de l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 20, 0, 0 );
     
     
    for( i = 0; i < MIN(lines->total,10); i++ )
    {
    	float* line = (float*)cvGetSeqElem(lines,i);
    	float rho = line[0];
    	float theta = line[1];
    }
    A+

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

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

Discussions similaires

  1. Trouver le meilleur élève, noté avec des lettres
    Par oursviking dans le forum Requêtes et SQL.
    Réponses: 34
    Dernier message: 12/12/2010, 20h10
  2. trouver les meilleures combinaisons
    Par Emma95 dans le forum Excel
    Réponses: 15
    Dernier message: 15/04/2010, 14h20
  3. Trouver les meilleurs scores de chaque joueur
    Par nycolas dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/08/2009, 06h09
  4. [FireBird] Quels sont les meilleurs composants utilisés avec delphi?
    Par aityahia dans le forum Bases de données
    Réponses: 13
    Dernier message: 05/04/2008, 17h13
  5. Où trouver les meilleurs thèmes ?
    Par elitost dans le forum Ubuntu
    Réponses: 3
    Dernier message: 25/09/2007, 14h06

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