/// <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);
        }
Exemple #2
0
        /// <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()));
        }