/// <inheritdoc/> public bool TryFindSymbol(QSymbol currentFragment, out QAnalyzedSymbol analyzedSymbol) { /* * Поиск полного соответствия фрагмента символу базы знаний. */ foreach (var possibleSymbol in _knownSymbols) { // Если данный символ присутствует в базе знаний if ( possibleSymbol.Codes.Where(code => code.Height == currentFragment.Monomap.Height) .Any(item => item.EulerCode.GetHashCode() == currentFragment.Euler.GetHashCode())) { analyzedSymbol = new QAnalyzedSymbol( currentFragment, new[] { new QChar(possibleSymbol.Chr, QState.Ok) }); return(true); } } analyzedSymbol = null; return(false); }
/// <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())); }