Partage
  • Partager sur Facebook
  • Partager sur Twitter

C# Détection de forme Aforge cas particulier

    16 avril 2020 à 15:51:40

    Bonjour,

    Je dois faire un travail en binôme qui traite la détection de forme dans mon cas c'est de la détection de cercle dans une image .bmp ou via une capture d'image d'une webcam et qui va utiliser Emgu et Aforge.

    Je dois faire le travail sous Aforge. J'ai réussi à effectuer la capture d'une image via ma webcam et le chargement d'une image présent sur mon disque dur qui est la partie la moins difficile de ce travail, de plus j'ai réussi la détection de mes formes et à les compter. Maintenant, on s'est ajouté une difficulté dans la détection de nos cercles c'est de pouvoir détecter nos cercles avec des contrastes différentes et la détection de cercles qui se superposent formant un groupe qui ressemble à tout sauf à un cercle (donc la détection des cercles formant ce groupe).

    Maintenant le problème c'est que je ne vois pas comment faire pour le deuxième défis pour que mon programme puisse détecter chaque cercle composant notre groupe. Pour le premier défis j'ai pensé à deux solutions possibles soit modifier la valeur de mon seuil de détection, soit accentuer le contraste des cercles.

    Merci d'avance pour votre aide.

    P.S: voici mon code qui permet de traiter mon image:

            private void traite_Click(object sender, EventArgs e)
            {
    
                Bitmap img = (Bitmap)pictureBox2.Image;
                //Bitmap img = new Bitmap(pictureBox2.Image,pictureBox2.Image.Size);
                AForge.Imaging.Image.SetGrayscalePalette(img);
                int nbr = 0;
                // collect statistics
                //HorizontalIntensityStatistics his = new HorizontalIntensityStatistics(img);
                ImageStatistics his = new ImageStatistics(img);
                // get gray histogram (for grayscale image)
                Histogram histogram = his.Gray;
                // output some histogram's information
                label4.Text = "Valeur medianne histogramme : " + (histogram.Median);
                label5.Text = "Valeur minimale histogramme : " + (histogram.Min);
                label6.Text = "Valeur maximale histogramme : " + (histogram.Max);
                int seuil = histogram.Max - histogram.Min;
                
                Threshold filtre = new Threshold(seuil);
                filtre.ApplyInPlace(img);
                BlobCounter blobCount = new BlobCounter();
                blobCount.ProcessImage(img);
                Blob[] blobs = blobCount.GetObjectsInformation();
                SimpleShapeChecker shapechecker = new SimpleShapeChecker();
                for (int i = 0, n = blobs.Length; i < n; i++)
                {
    
    
                    List<IntPoint> edge = blobCount.GetBlobsEdgePoints(blobs[i]);
                    AForge.Point centre;
                    float radius;
                    if (shapechecker.IsCircle(edge, out centre, out radius) && radius < 17.5)
                    {
                        nbr = nbr + 1;
                    }
                }
    
                pictureBox3.Image = (Bitmap)img.Clone();
                res.Text = Convert.ToString("Il y a " + nbr + " colonies");
            }



    -
    Edité par kilikamars 16 avril 2020 à 16:46:32

    • Partager sur Facebook
    • Partager sur Twitter
      2 juin 2020 à 18:50:08

      Bonjour,

      Je fais un petit up de mon sujet.

      J'ai peut-être réussi à trouver une piste de solution pour le cas des points sombres avec le code suivant qui doit être adapté car ne prenant que des pixels noirs :

              private void sombra5()
              {
                  Bitmap myBitmap = _img;
                  Bitmap clone = new Bitmap(myBitmap.Width, myBitmap.Height, PixelFormat.Format24bppRgb);
                  int skipX = 12;
                  int skipY = 12;
      
                  int detectedDots = 0;
      
                  for (int x = 0; x < myBitmap.Width; x += skipX)
                  {
                      for (int y = 0; y < myBitmap.Height; y += skipY)
                      {
                          Color pixelColor = clone.GetPixel(x, y);
      
                          if (pixelColor.R + pixelColor.G + pixelColor.B == 0 && clone.GetPixel(x , y).GetBrightness() < 0.05 )
                          {
      
                              detectedDots++;
                          }
                      }
                  }
      
                  res.Text = detectedDots + " dots detected";
                  pictureBox3.Image = (Bitmap)clone.Clone();
              }


      Le fait d'utiliser getPixel(x,y) me gêne un peu car j'ai vu sur plusieurs sujets que cette méthode n'est pas forcément génial a utilisé si on veut avoir quelque chose de rapide, je me demandais s'il existe une alternative à cette méthode.

      D'ailleurs j'aurais une autre question par rapport à Aforge est-il possible de modifier le fond par défaut de la détection d'élément ?

      Voici le lien des images sur lesquelles je travail  :https://drive.google.com/drive/folders/1fMimFg9Weh-IM21tItXlzDB0xTOFtcF3?usp=sharing

      -
      Edité par kilikamars 4 juin 2020 à 16:32:49

      • Partager sur Facebook
      • Partager sur Twitter
        4 juin 2020 à 7:41:06

        Bonjour,

        Lit ça http://www.aforgenet.com/articles/shape_checker/ cet article pourrait t'aider. c'est sensé allez vite.Je pense c'est aforge.Et https://stackoverflow.com/questions/41830366/object-detection-using-aforge-c-sharp.

        -
        Edité par Konect Team 4 juin 2020 à 7:44:49

        • Partager sur Facebook
        • Partager sur Twitter

        Si vous aimez mes conseilles allez sur mon site : https://keepkonect.tk et bénéficier d'un cloud avec espace mémoire illimité

          4 juin 2020 à 16:31:36

          Merci pour la réponse.

          J'avais déjà trouvé cet article,même si cela permet la détection de forme malheureusement il n'y a pas vraiment d'indication pour permettre la détection des regroupement de forme (en l’occurrence des cercles) et pour des formes très petites avec une luminosité faible. Voila plus en détails le genre d'image qui seront traiter par mon application, je précise que ce qui sera traité par mon application sera ce qui est contenue à l'intérieur du cercle(c'est à dire la partie avec le quadrillage).

           

          • Partager sur Facebook
          • Partager sur Twitter
            4 juin 2020 à 16:54:09

            Je pense alors que getpixel est la meilleur solution si tu peux prendre le temps que tu veux pour aller plus vite tu réduire un peu la taille de ton image.
            • Partager sur Facebook
            • Partager sur Twitter

            Si vous aimez mes conseilles allez sur mon site : https://keepkonect.tk et bénéficier d'un cloud avec espace mémoire illimité

            C# Détection de forme Aforge cas particulier

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown