public RecognizedLetter Recognize(SnapshotLetter snapshotLetter, DatabaseManager databaseManager) { if (snapshotLetter.IsDark) { return(new RecognizedLetter(RecognitionLetterKind.Dark, "Dark", "", snapshotLetter)); } List <LetterSample> letters = new List <LetterSample>(); lock (databaseManager.DatabaseLock) { foreach (var sample in databaseManager.Database.OfType <LetterSample>()) { if (!sample.Scanned) { sample.ColorData = bot.PresageAndRecognize.SimplifyLetter(sample.Bitmap, new Rectangle(0, 0, sample.Bitmap.Width, sample.Bitmap.Height)); sample.Scanned = true; } letters.Add(sample); } if (letters.Count > 0) { LetterSample closestMatch = letters.MinBy(sample => bot.PresageAndRecognize.GetDistance(snapshotLetter.SimplifiedData, sample.ColorData)); int distance = bot.PresageAndRecognize.GetDistance(snapshotLetter.SimplifiedData, closestMatch.ColorData); if (distance <= PresageAndRecognize.THRESHOLD_OF_DISTANCE_FOR_MATCH) { if (closestMatch.Kind == SampleKind.Known) { return(new RecognizedLetter(RecognitionLetterKind.Letter, closestMatch.Letter.ToString(), distance.ToString(), snapshotLetter)); } else if (closestMatch.Kind == SampleKind.BannedStone) { return(new RecognizedLetter(RecognitionLetterKind.BannedLetter, "Banned", distance.ToString(), snapshotLetter)); } else { return(new RecognizedLetter(RecognitionLetterKind.RecognizedButUnassigned, "RbU" + closestMatch.Letter.ToString(), distance.ToString(), snapshotLetter)); } } else { if (closestMatch.Kind == SampleKind.Known) { return(new RecognizedLetter(RecognitionLetterKind.UnknownLetter, "?" + closestMatch.Letter.ToString(), distance.ToString(), snapshotLetter)); } else if (closestMatch.Kind == SampleKind.BannedStone) { return(new RecognizedLetter(RecognitionLetterKind.UnknownLetter, "?Banned", distance.ToString(), snapshotLetter)); } else { return(new RecognizedLetter(RecognitionLetterKind.UnknownLetter, "?RbU" + closestMatch.Letter.ToString(), distance.ToString(), snapshotLetter)); } } } return(new RecognizedLetter(RecognitionLetterKind.UnknownLetter, "??", "no db", snapshotLetter)); } }
internal void AddSingle(SnapshotLetter letter) { this.AddSingle(new LetterSample(letter)); }
public RecognizedLetter(RecognitionLetterKind kind, string letter, string desc, SnapshotLetter snapshotLetter) { this.SnapshotLetter = snapshotLetter; this.Kind = kind; this.DisplayTwoLine = letter + "\n" + desc; this.Letter = letter; }
public LetterSample(SnapshotLetter letter) { this.Bitmap = letter.Bitmap; this.Kind = SampleKind.Unassigned; }