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 :

Dessin de contours


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut Dessin de contours
    Bonjour,

    J'ai une image sur laquelle je désire détecter des contours d'une taille connu.
    Je binarise mon image et ensuite j'utilise la fontion cvFindContours pour trouver les contours dans mon image. Ceci marche très bien, mais je souhaiterai éliminer certain contours en ne les dessinant pas, en gros ceux dont la taille ne me convient pas.
    Voici mon code:

    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
     
     // determine les contours des blobs
     nb_contours=cvFindContours ( img, mem, &contour, sizeof( CvContour ),  CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
     
     
        for(;contour!=0;contour=contour->h_next)
        {
                //Si la taille du contour est bonne je la conserve et l'affiche
    	    if((fabs(cvContourArea(contour, CV_WHOLE_SEQ ))>400)&&(fabs(cvContourArea(contour, CV_WHOLE_SEQ ))<2200))
           {
    	        color=CV_RGB(rand()&255,rand()&255,rand()&255);
        	        cvDrawContours( RegionConnexe, contour, color, color,1,CV_FILLED,8);
        	}
        	else
        	{
    //		        color=CV_RGB(0,0,0);
    	//		    cvDrawContours( RegionConnexe, contour, color, color,1,CV_FILLED,8);
        	}
        }
    Cette boucle marche très bien quand je laisse le else dans lequel je dessine les contours non désiré en noir. Mais lorsque j'élimine ce else il m'affiche des coutours qui ne devrai pas s'afficher et qui plus est dans la meme couleur que ceux qui doivent être conservé.(voir image ci dessous). Le problème est qu'en dessinant en noir mes contours non désiré je perd énormément de temps à l'exécution et j'ai besoin d'être le plus rapide possible pour des contraintes de temps pour la suite du programme.

    Image souhaité:


    Image obtenu:


    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut
    Salut,

    si l'on part du principe que tu ne peut pas passer dans le if et le else en meme temps, je pense que les contours non désiré son déja present dans ton image.
    Ainsi lorsque tu passe dans le else, je pense que tu dessine par dessus les contours non voulu.

    Peut tu vérifier ce que tu redessine dans le if en mode debug pas à pas ?

    Autre méthode de verification : tu ouvres une nouvelle image (imgResult par exemple) avec opencv. Et lorsque tu passe dans ton if, tu dessines dans imgResults.
    Cette méthode t'évite de redessiner des contours non voulu.

    J'espere avoir été clair.
    Bon courage.

    EDIT :
    vérifie aussi tes crochets, l'indentation est un peu bizarre

  3. #3
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut
    Merci pour ta réponse sapin.
    Effectivement les contours non désiré sont déjà présent au premier passage de ma boucle.
    La question maintenant est comment supprimé les contours non désiré en amont du drawcontours.

  4. #4
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Par défaut
    J'ai ajouté ce bout de code après le find contours pour supprimé les contours non désiré mais il plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	int count=0;
     
    	for(;contour!=0;contour=contour->h_next)
      	{
    	    if((fabs(cvContourArea(contour, CV_WHOLE_SEQ ))>1000)&&(fabs(cvContourArea(contour, CV_WHOLE_SEQ ))<2200))
    	    {
    	    	cout<<"REMOVE"<<endl;
    			cvSeqRemove(contour,count);
    	    	cout<<"REMOVE OFF"<<endl;
    		}
    		count++;		
    	}
    Voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OpenCV ERROR: One of arguments' values is out of range (Invalid index)
    	in function cvSeqRemove, cxdatastructs.cpp(1596)
    Je ne comprend pas le problème

Discussions similaires

  1. [Débutant] dessiner les contours des régions d'une image
    Par Imène_23 dans le forum Images
    Réponses: 33
    Dernier message: 12/02/2013, 11h03
  2. Dessiner un contour sur une image
    Par tagrawla dans le forum C#
    Réponses: 4
    Dernier message: 27/01/2011, 09h46
  3. Réponses: 5
    Dernier message: 07/12/2006, 00h19
  4. Dessiner un contour en dégradé
    Par Sergejack dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 30/08/2006, 00h52
  5. dessiner le contour d'un jpanel
    Par iamspacy dans le forum Composants
    Réponses: 4
    Dernier message: 11/05/2004, 15h11

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