/// <summary> /// Распознать <see cref="IMonomap"/>. /// </summary> /// <param name="monomap">Ссылка на <see cref="IMonomap"/>.</param> /// <returns></returns> public QReport Recognize(IMonomap monomap) { // TODO Там надо анализировать как то раздробленные картинки // Получаем все фрагменты изображения IList <QSymbol> unknownFragments = _scanner.GetFragments(monomap); var recognizedSymbols = new ConcurrentBag <QAnalyzedSymbol>(); /* * Описываю алгоритм: * 1. Распознаём все фрагмент которые 100% есть в базе * 2. Идём по не распознанным фрагментам и если справа или слева есть распознанный, то берём высоту распознанного и захватываем вверх * и вниз в 3 пикселя, если там есть фрагменты то плюсуем к фрагменту */ // Пункт 1. foreach (var unknownFragment in unknownFragments.ToArray()) { var existingSymbol = recognizedSymbols.FirstOrDefault( symbol => symbol.Euler.GetHashCode() == unknownFragment.Euler.GetHashCode()); if (existingSymbol == null) { QAnalyzedSymbol analyzedSymbol; if (_analyzer.TryFindSymbol(unknownFragment, out analyzedSymbol)) { recognizedSymbols.Add(analyzedSymbol); unknownFragments.Remove(unknownFragment); } } else { var newSymbol = new QAnalyzedSymbol(unknownFragment, existingSymbol.Chars); recognizedSymbols.Add(newSymbol); } } // Пункт 2. foreach (var unknownFragment in unknownFragments.Where(fragment => fragment != null)) { if (recognizedSymbols.Any(symbol => symbol.StartPoint == unknownFragment.StartPoint)) { continue; } QAnalyzedSymbol analyzedSymbol = _analyzer.AnalyzeFragment( unknownFragment, unknownFragments, recognizedSymbols); recognizedSymbols.Add(analyzedSymbol); } ; return(new QReport(recognizedSymbols.ToArray())); }