internal void AddSingle(LetterSample letter)
 {
     lock (DatabaseLock)
     {
         Database.Add(letter);
         SaveDatabase();
     }
 }
Example #2
0
        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));
            }
        }