private void FindText(OcrData ocrData, float tolerance, FoundCharacterData previousCharacterData, List<char> foundChars) { foreach (CharacterDataSet characterDataSet in ocrData.TrainedCharacterDataSets) { List<FoundCharacterData> foundCharacterDatas = InternalFindCharacterDataSet(characterDataSet, tolerance, previousCharacterData).ToList(); if (foundCharacterDatas.Any()) { foundChars.Add(foundCharacterDatas[0].CharacterData.Letter); FindText(ocrData, tolerance, foundCharacterDatas[0], foundChars); } } }
private IEnumerable<FoundCharacterData> InternalFindCharacterDataSet(CharacterDataSet characterDataSet, float tolerance, FoundCharacterData previousCharacterData = null) { int startX = 0; int startY = 0; int maxX = neighborDifferences.GetLength(1); int maxY = neighborDifferences.GetLength(0); if (previousCharacterData != null) { startY = Math.Max(0, previousCharacterData.Point.Y + previousCharacterData.CharacterData.HeightFromWritingLine - characterDataSet.MaxHeight); startX = Math.Min(bitmap.Width, previousCharacterData.Point.X + previousCharacterData.CharacterData.Width - 2); maxX = startX + characterDataSet.MaxWidth+3; maxY = startY + characterDataSet.MaxHeight * 2; } List<FoundCharacterData> foundCharacterDatas = new List<FoundCharacterData>(); for (int y = startY; y < maxY; y++) { for (int x = startX; x < maxX; x++) { CharacterData characterData = CharacterMatchAtPoint(x, y, characterDataSet, tolerance); if (characterData != null) { FoundCharacterData foundCharacterData = new FoundCharacterData { Point = new Point(x, y), CharacterData = characterData }; if(!foundCharacterDatas.Any(f => f.Bounds.IntersectsWith(foundCharacterData.Bounds))) yield return foundCharacterData; } } } }
private FoundCharacterData FindCharacterDataSet(CharacterDataSet characterDataSet, float tolerance, FoundCharacterData previousCharacterData) { int startY = Math.Max(0, previousCharacterData.Point.Y + previousCharacterData.CharacterData.HeightFromWritingLine - characterDataSet.MaxHeight - 2); int startX = Math.Min(bitmap.Width, previousCharacterData.Point.X + previousCharacterData.CharacterData.Width - 2); int maxX = startX + characterDataSet.MaxWidth+3; int maxY = startY + characterDataSet.MaxHeight * 2; for (int y = startY; y < maxY; y++) { for (int x = startX; x < maxX; x++) { CharacterData characterData = CharacterMatchAtPoint(x, y, characterDataSet, tolerance); if (characterData != null) { return new FoundCharacterData { Point = new Point(x, y), CharacterData = characterData }; } } } return null; }