Petit probleme de boucle dans la reconnaissance de forme

Signaler
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012
-
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012
-
bonjour
je suis entrain de developper une application en C# WinForm pour faire la detection de forme mon probleme c'est que mon programme marche en pas à pas mais qd je l'execute normalement il beugue et qd j ai verifié en pas à pas c'etait une boucle durant longtemps pour la detection de forme j'ai utilisé la bibliotheque AForge et voici la boucle et aussi le site de la biliotgheque :
http://www.aforgenet.com/articles/shape_checker/
// ------------- Detection de cercle -------------  
                    for (int i 0, n blob.Length; i < n; i++)
                    {
                        // la detection des pixels de bord pour savoir la forme 
                        List edgePoints = blobCounter.GetBlobsEdgePoints(blob[i]);
                         DoublePoint centre;
                         double rayon;
                         //------------- Pour le cercle -------------
                         // Si la forme detecter est un cercle 
                         if (shapeChecker.IsCircle(edgePoints, out centre, out rayon))
                         {
                             // la methodes DrawEllipse à pour but de creer un rectangle pour estimer le rayon et le cercle pour detecter la forme du cercle 
                             g.DrawEllipse(Bleu,
                                 (float)(centre.X - rayon), (float)(centre.Y - rayon),
                                 (float)(rayon * 2), (float)(rayon * 2));
                             if (rayon >= 22)
                                 // le nombre de LEDs exisante
                                 nombre_led = nombre_led + 1;
                         }
                     }

5 réponses

Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
Salut,

Ton programme "bug" mais as tu un message d'erreur qui s'affiche ?
Si ta boucle dure longtemps, est ce que la forme ne contient pas trop de points à détecter ?

De plus tu traces ton ellipse à l'intérieur de ta boucle c'est à dire pour chaque pixel détectés. N'y a t'il pas un soucis de ce côté ?

bref que des questions pour toi mais pas de réponses à te donner.

@+

SD



[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Oy idriss,

c'est un vrai bug ? tu as une erreur (et son message) ?
ou alors c'est que la boucle est trop longue et ton appli semble "freezer" ?
Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
Re,

je viens de jeter un oeil vite fait sur ton lien et je vois qu'il y a des dispose() apres la boucle.
Belu.Dispose()
g.Dispose()

Je suppose que tu les as toi aussi ?
Mais je ne pense pas que cela vienne de ça mais sait on jamais.

@+

SD


[b]"Chez ceux qui semblent très vertueux se cachent en général la vanité, l'orgueil, l'intolérance".

P.Coehlo (Maktub 2004)/b
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

Bonjour, tout le monde beh pour le programme il ya pas de message d'erreur c'est juste si j'insere une image dans mon programme il met bcp de temps pour afficher le resultat par exemple si je met une image de 1280x720 le blob.lentgh vaut 143 donc ma boucle fait 143 le tour en plus j'ai deux autre boucle imbriquer et pour afficher le resultat c'est 20 mnt un peux pret voici mes deux boucles imbriqué et celle que je mis hier :
private void ProcessImage(Bitmap bitmapecran)
        {  
            // Appel de la fonction Detection LEDs seuillage et redimensionnement 

            int nombre_led = 0;
            
            // balayage auomatique du seuillage
            for(int k=475;k<=490;k++)
            {
                 balayage auomatique du redimentionnement 
             for(double j=0.78;j<=0.8;j=j+0.01)
                {
                    // balayage automatique du redimentionnment

                    
                    nombre_led = 0;
                    Bitmap bitmap = DetectionLeds(bitmapecran, k, j);
                    // Enfermer l'image de l'entree afin qu'elle puisse etre modifié 
                    BitmapData bitmapData = bitmap.LockBits(
                    new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                    ImageLockMode.ReadWrite, bitmap.PixelFormat);
                    // ------------- Localisation de Forme -------------
                    // Creation d'objet FormeLocaliser
                    BlobCounter blobCounter = new BlobCounter();
                    blobCounter.FilterBlobs = true;
                    // Mettre l'objet creer dans l'image d'entreé 
                    blobCounter.ProcessImage(bitmapData);
                    // Avoir toutes les informations sur l'image d'entrée
                    Blob[] blob = blobCounter.GetObjectsInformation();
                    // Liberer l'image de l'entrer apres avoir passer en localisation d'objet 
                    bitmap.UnlockBits(bitmapData);
                    // Creation d'objet graphique 
                    SimpleShapeChecker shapeChecker = new SimpleShapeChecker();
                    Graphics g = Graphics.FromImage(bitmap);
                    // Entourer les cercles par une couleurs Jaune 
                    Pen Bleu = new Pen(Color.Blue, 2);// circles
                    // ------------- Detection de cercle -------------  
                    for (int i 0, n blob.Length; i < n; i++)
                    {
                        // la detection des pixels de bord pour savoir la forme 
                        List edgePoints = blobCounter.GetBlobsEdgePoints(blob[i]);
                         DoublePoint centre;
                         double rayon;
                         //------------- Pour le cercle -------------
                         // Si la forme detecter est un cercle 
                         if (shapeChecker.IsCircle(edgePoints, out centre, out rayon))
                         {
                             // la methodes DrawEllipse à pour but de creer un rectangle pour estimer le rayon et le cercle pour detecter la forme du cercle 
                             g.DrawEllipse(Bleu,
                                 (float)(centre.X - rayon), (float)(centre.Y - rayon),
                                 (float)(rayon * 2), (float)(rayon * 2));
                             if (rayon >= 22)
                                 // le nombre de LEDs exisante
                                 nombre_led = nombre_led + 1;
                         }
                     }
                     if (nombre_led == 66)
                     {
                         k = 2000;
                         j = 1000;
                     }
                         
                    
                    // application du contour du cercle en Jaune à de la classe drawing System 
                    Bleu.Dispose();
                    // application de l'objet graphique à l'aide de la  classe drawing Graphique
                    g.Dispose();
                    Clipboard.SetDataObject(bitmap);
                    pictureBox.Image = bitmap;
                    
                }
                
            }
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

bonjour,
Je demande de l'aide pour le probleme que je rencontre car la je bloque et j'avance SVP je sais pas quoi faire mnt merci