Пример #1
0
        /// <summary>
        /// Calcul d'un pourcentage de pixels dans une zone d'image
        /// </summary>
        /// <param name="src">Image dans laquelle on analyse</param>
        /// <param name="zone">Rectangle représentant la zone de l'image à analyser</param>
        /// <param name="erreur">Taux de clarté autorisé [0-255]. Exemple: 40 autorisera les pixels dont les valeurs R,G et B sont inférieures à 40.</param>
        /// <param name="B">Autoriser la détection de couleur Blue.</param>
        /// <param name="G">Autoriser la détection de couleur Green.</param>
        /// <param name="R">Autoriser la détection de couleur Red.</param>
        /// <returns>Pourcentage calculé dans cette zone de l'image.</returns>
        public static float getNbPixelsNoirs(Bitmap src, Rectangle zone, int erreur, bool R, bool G, bool B)
        {
            List <Color> listePixels = Detection.getZonePixels(src, zone);
            int          nbPixels = 0;
            int          valeurR = (R) ? 255 : erreur, valeurG = (G) ? 255 : erreur, valeurB = (B) ? 255 : erreur;

            foreach (Color c in listePixels)
            {
                //R XOR G XOR B
                if (((R || G || B) && !((R && B) || (G && B) || (R && G) || (R && B && G))) &&
                    (c.R < valeurR && c.G < valeurG && c.B < valeurB))
                {
                    nbPixels++;
                }

                else if (R && G)
                {
                    if ((c.R < valeurR && c.G < erreur && c.B < valeurB) || (c.R < erreur && c.G < valeurG && c.B < valeurB))
                    {
                        nbPixels++;
                    }
                }
                else if (R && B)
                {
                    if ((c.R < valeurR && c.G < valeurG && c.B < erreur) || (c.R < erreur && c.G < valeurG && c.B < valeurB))
                    {
                        nbPixels++;
                    }
                }
                else if (G && B)
                {
                    if ((c.R < valeurR && c.G < valeurG && c.B < erreur) || (c.R < valeurR && c.G < erreur && c.B < valeurB))
                    {
                        nbPixels++;
                    }
                }
                else if (R && G && B)
                {
                    if ((c.R < valeurR && c.G < valeurG && c.B < erreur) ||
                        (c.R < valeurR && c.G < erreur && c.B < valeurB) ||
                        (c.R < erreur && c.G < valeurG && c.B < valeurB))
                    {
                        nbPixels++;
                    }
                }
                else if (c.R < valeurR && c.G < valeurG && c.B < valeurB)
                {
                    nbPixels++;
                }
            }

            int totalPixels = zone.Height * zone.Width;

            float result = (((float)nbPixels / (float)totalPixels) * 100);

            return(result);
        }
Пример #2
0
        /// <summary>
        /// Calcul d'un pourcentage de pixels dans une zone d'image
        /// </summary>
        /// <param name="src">Image dans laquelle on analyse</param>
        /// <param name="zone">Rectangle représentant la zone de l'image à analyser</param>
        /// <param name="erreur">Taux de clarté autorisé [0-255]. Exemple: 40 autorisera les pixels dont les valeurs R,G et B sont inférieures à 40.</param>
        /// <returns>Pourcentage calculé dans cette zone de l'image.</returns>
        public static float getNbPixelsNoirs(Bitmap src, Rectangle zone, int erreur)
        {
            List <Color> listePixels = Detection.getZonePixels(src, zone);
            int          nbPixels    = 0;

            foreach (Color c in listePixels)
            {
                if (c.R < erreur && c.G < erreur && c.B < erreur)
                {
                    nbPixels++;
                }
            }

            int totalPixels = zone.Height * zone.Width;

            float result = (((float)nbPixels / (float)totalPixels) * 100);

            return(result);
        }
Пример #3
0
        /// <summary>
        /// Méthode non-optimale pour détecter un rond
        /// </summary>
        public static PixelsCircle getPixelsNoirsRond(Bitmap src, Rectangle zone, int erreur)
        {
            List <Color> listePixels = Detection.getZonePixels(src, zone);

            float margeErreurPixels = (1 * (float)src.Width) / 100;

            int maxPixelsNoirsLigne = 0;
            int indexLigne1 = 0, indexLigneN = 0, indexLigneMilieu = 0;

            //Transfert de chaque ligne de pixels dans des listes
            List <List <Color> > lignePixels = new List <List <Color> >();
            int compteurListe = 0, c = 0;

            lignePixels.Add(new List <Color>());

            foreach (Color col in listePixels)
            {
                lignePixels[compteurListe].Add(col);
                c++;
                if (c == zone.Width)
                {
                    c = 0;
                    compteurListe++;
                    lignePixels.Add(new List <Color>());
                }
            }

            //Récupération de la ligne du milieu du cercle par maxima
            for (int z = 0; z < lignePixels.Count; z++)
            {
                if (getNbPixelsNoirs(lignePixels[z], erreur) > maxPixelsNoirsLigne)
                {
                    maxPixelsNoirsLigne = getNbPixelsNoirs(lignePixels[z], erreur);
                    indexLigneMilieu    = z;
                }
            }

            if (indexLigneMilieu == 0)
            {
                Console.WriteLine("Cette zone ne contient pas de rond1");
                return(null);
            }

            //Verification existance cercle vers le haut du diamètre
            for (int y = indexLigneMilieu; y >= 0; y--)
            {
                if ((y - 1) == 0)
                {
                    Console.WriteLine("Cette zone ne contient pas de rond2");
                    return(null);
                }
                //Console.Write(positionPremierPixelNoir(lignePixels[y - 1], erreur) + ";" + positionPremierPixelNoir(lignePixels[y], erreur) + " ");
                if ((positionPremierPixelNoir(lignePixels[y - 1], erreur) - positionPremierPixelNoir(lignePixels[y], erreur) > margeErreurPixels))
                {
                    Console.WriteLine("Cette zone ne contient pas de rond3");
                    return(null);
                }
                if (getNbPixelsNoirs(lignePixels[y - 1], erreur) - getNbPixelsNoirs(lignePixels[y], erreur) > margeErreurPixels)
                {
                    Console.WriteLine("Cette zone ne contient pas de rond3bis");
                    return(null);
                }
                if (getNbPixelsNoirs(lignePixels[y], erreur) == 0)
                {
                    indexLigne1 = y + 1;
                    break;
                }
            }

            //Verification existance cercle vers le bas du diamètre
            for (int y = indexLigneMilieu; y < lignePixels.Count; y++)
            {
                if ((y + 1) == lignePixels.Count)
                {
                    Console.WriteLine("Cette zone ne contient pas de rond4");
                    return(null);
                }

                if ((positionPremierPixelNoir(lignePixels[y + 1], erreur) - positionPremierPixelNoir(lignePixels[y], erreur) > margeErreurPixels))
                {
                    Console.WriteLine("Cette zone ne contient pas de rond5");
                    return(null);
                }
                if (getNbPixelsNoirs(lignePixels[y + 1], erreur) - getNbPixelsNoirs(lignePixels[y], erreur) > margeErreurPixels)
                {
                    Console.WriteLine("Cette zone ne contient pas de rond5bis");
                    return(null);
                }
                if (getNbPixelsNoirs(lignePixels[y], erreur) == 0)
                {
                    indexLigneN = y - 1;
                    break;
                }
            }

            //Vérification Cercle finale
            bool b1 = getNbPixelsNoirs(lignePixels[indexLigne1], erreur) >= getNbPixelsNoirs(lignePixels[indexLigneMilieu], erreur);
            bool b2 = getNbPixelsNoirs(lignePixels[indexLigneN], erreur) >= getNbPixelsNoirs(lignePixels[indexLigneMilieu], erreur);
            bool b3 = Math.Abs(getNbPixelsNoirs(lignePixels[indexLigne1], erreur) - getNbPixelsNoirs(lignePixels[indexLigneN], erreur)) > margeErreurPixels * 2;

            if (b1 || b2 || b3)
            {
                Console.WriteLine("Cette zone ne contient pas de rond6");
                return(null);
            }
            else
            {
                indexLigneMilieu = (indexLigne1 + indexLigneN) / 2;

                return(new PixelsCircle(zone.X + positionPremierPixelNoir(lignePixels[indexLigneMilieu], erreur) + (maxPixelsNoirsLigne / 2),
                                        zone.Y + indexLigneMilieu + 1, maxPixelsNoirsLigne));
            }
        }