/// <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); }
/// <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); }
/// <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)); } }