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 :

Détection de nouveaux contours entrés dans une image


Sujet :

OpenCV

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Détection de nouveaux contours entrés dans une image
    Bonjour tout le monde,
    je veux détecter les contours des nouveaux objets introduits dans une image , j'utilise VS 2010 et openCV 2.4.5. J'ai commencé avec la détection des contours avec le filtre de canny des deux images que je vais comparer puis j'ai utilisé cv::matchShapes. Malheureusement, j'ai obtenu des résultats fausses , j'obtiens toujours des contours qui figurent dans l'image référence .
    SVP j'ai besoin de l'aide
    voila la partie de code qui détecte les nouveaux objets

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    int detection::compare_contours()
    {	int nb=0;
    	 vector<vector<Point> > contourp1;
    	  vector<vector<Point> > contourp2;
    	   vector<Vec4i> hierarchyp2;
    	canny ct1(im1);
    	canny ct2 (im2);
    	ct1.edge_show();
    	ct2.edge_show();
       	if( (ct1.contours.size())!=(ct2.contours.size()) )
    	{  
    		nb=1;
    	  cout<<"nouveaux objets introduits"<<endl;
    	}
    	else {
    		cout<<"memes objets"<<endl; 
    	}
    	contourp1=ct1.contours;
    	contourp2=ct2.contours;
    	hierarchyp2=ct2.hierarchy;
     
    	int k=0;
    	/*********************************************/
    	for (int j=0;j<ct2.contours.size();j++)
    	{
    		double result=0;
    		for (int i=0;i<ct1.contours.size();i++)
    		{
    			result=result+matchShapes(Mat(ct1.contours[i]), Mat(ct2.contours[j]), CV_CONTOURS_MATCH_I3, 0);
    		}
    		if (result==0) {
    			            contourp2.erase(contourp2.begin()+k);
    		                hierarchyp2.erase(hierarchyp2.begin()+k);
    		                }
    		else k++;
     
    	}
    	k=0;
    	for (int j=0;j<ct1.contours.size();j++)
    	{
    		double result=0;
    		for (int i=0;i<ct2.contours.size();i++)
    		{
    			result=result+matchShapes(Mat(ct2.contours[i]), Mat(ct1.contours[j]), CV_CONTOURS_MATCH_I3, 0);
    		}
    		if (result==0) {contourp1.erase(contourp1.begin()+k);}
    		else k++;
     
    	}
    	cout << contourp1.size() << endl;
     
     
    	/************************************************************/
     
    	for (int j=0;j<contourp2.size();j++)
    	{
    		int i=0;
    		double compare =1;
    		//int size=1;&&(size!=0) && (size!=0)
    		while ( (i<contourp1.size()) && (compare!=0) )
    		{
                  compare=cv::matchShapes(Mat(contourp1[i]), Mat(contourp2[j]), CV_CONTOURS_MATCH_I1, 0);
    			//  if (contourp1[i].size()==contourp2[j].size()){size=0;}
    			  i++;
    		}
    		if  (compare!=0) {nvcontour.push_back(contourp2[j]);
    		                  nvhierarchy.push_back(ct2.hierarchy[j]);}
    	}
    /***************************************************/
     
    	if ( nvcontour.size() != 0) 
    	{  
    		cout <<"images differentes"<<endl;
    		cout <<" taille du nouveau vecteur"<<nvcontour.size()<<endl;		
    	}
    	else {
    		cout <<"images similaires"<<endl;
    	    cout <<" taille du nouveau vecteur"<<nvcontour.size()<<endl;
    	}
     
    	//drawing
    	Mat dstt= Mat::zeros(ct1.src.rows,ct2.src.cols, CV_8UC3);
     
        for(int idx=0;idx<nvcontour.size();idx++ )
        {
            Scalar color( rand()&255, rand()&255, rand()&255 );
            drawContours( dstt,nvcontour, idx, color, CV_FILLED, 8);
        }
    	//show in window
    	 namedWindow( "nouveaux", CV_WINDOW_AUTOSIZE );
        imshow( "nouveaux",dstt);
    	return nb;
    }

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 16
    Points
    16
    Par défaut
    Salut, tu peux peut être tenter de faire la différence entre les 2 images afin d'isoler les objets introduits, si tu peux afficher une image on pourrait mieux visualiser le problème je pense ^^

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Voilà les deux images que je vais comparer et extraire le nouveau objet ajouté (en rouge ici) le resultat obtenu par cvmatchShapes n'est pas correct dans le cas des deux images différentes mais elle est correcte si je donne deux images analogues , le programme detecte qu'il n'y a pas de nouveaux objets introduits
    merci bien pour l'aide
    Images attachées Images attachées    

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Points : 16
    Points
    16
    Par défaut
    Est ce que les objets "d'origines" bougent? si non je pense qu'une simple différence entre les 2 images suffit.
    Sinon tu peux utiliser un descripteur comme SIFT pour comparer les points commun entre les 2 images et donc isoler les éléments en trop.
    Voici des explications sur son usage: http://fr.wikipedia.org/wiki/Scale-i...ture_transform
    Tu peux trouver facilement du code exemple dans la DOC d'opencv pour tester.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Il est normal de trouver de legere differences entre tes deux images au niveau des objets.
    Cela vient du fait que les images sont encodes en jpeg. La modification d'une partie de l'image se repercute (un peu) sur toute l'image lors de la compression.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if( (ct1.contours.size())!=(ct2.contours.size()) )
    	{  
    		nb=1;
    	  cout<<"nouveaux objets introduits"<<endl;
    	}
    C'est dangereux de faire cela. Canny est sensible aux difference d'illumination. Un contrast un peu plus prononce dans une image et tu as un contour que tu n'as pas dans l'autre, donc un objet selon ton code.

    @Angelitoto, c'est valable si on considere que l'illumination de change pas.

    Si effectivement, tu peux assurer que cela ne change pas, tu peux faire un truc simple du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int i = 0; i < img1.rows*img1.cols; i++)
       sortie[i] = (abs( img1[i] - img2[i]) < 5)? 0:255;
    Le 5 sert a eviter les petites erreurs.
    Sinon, une solution un peu plus complexe serait de prendre le pattern binaire local. C'est plus resistant aux petites differences.

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Voilà, j'ai maintenant une explication claire pourquoi mon algorithme ne fonctionne pas correctement je vais encore essayer de l'améliorer.
    Merci bien tout le monde

  7. #7
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Bonjour,

    Juste une petite remarque au sujet de la détermination de contour : une méthode de level set me paraitrait nettement plus adaptée vu le type d'images que tu sembles vouloir traiter. Après je me trompe peut-être

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

Discussions similaires

  1. Détection de contour précis dans une image propre
    Par electroremy dans le forum Traitement d'images
    Réponses: 14
    Dernier message: 17/08/2019, 10h28
  2. Détection de rectangles dans une image de contours (image binaire)
    Par Chatbour dans le forum Traitement d'images
    Réponses: 9
    Dernier message: 09/06/2010, 16h06
  3. Détection position des yeux dans une image
    Par Morvan Mikael dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 24/12/2008, 23h09
  4. Réponses: 1
    Dernier message: 29/04/2007, 22h12
  5. [D6] Algo de détection de zones dans une image
    Par DMO dans le forum Langage
    Réponses: 4
    Dernier message: 25/11/2005, 15h15

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