Предложения по распознаванию цифр

Я пишу приложение для Android, чтобы извлечь головоломку Sudoku из картинки. Для каждой ячейки сетки Sudoku 9×9 мне нужно определить, содержит ли она одну из цифр с 1 по 9 или пусто. Я начинаю с судоку следующим образом:

Введите описание изображения здесь

Я предварительно обрабатываю Sudoku с помощью OpenCV, чтобы извлекать черно-белые изображения отдельных цифр, а затем переносить их через Tesseract . Однако существует несколько ограничений для Tesseract:

  1. Tesseract большой, содержит много функциональности, в которой я не нуждаюсь (Т.е. полное распознавание текста), и для обучения требуются данные обучения на английском языке, которые, как мне кажется, должны поступать на SD-карту устройства. По крайней мере, я могу сказать, что нужно искать цифры только с помощью tesseract.setVariable("tessedit_char_whitelist", "123456789");
  2. Tesseract часто неправильно интерпретирует отдельные цифры в виде строки цифр, часто содержащих символы новой строки. Иногда это просто неправильно. Вот несколько примеров из вышеупомянутой судоку:

Введите описание изображения здесь

У меня есть три вопроса:

  1. Есть ли способ преодолеть ограничения Tesseract?
  2. Если нет, то какой полезный и точный метод обнаружения отдельных цифр (а не ближайших к ближайшим соседей), которые можно реализовать на Android – это может быть бесплатная библиотека или решение для DIY.
  3. Как я могу улучшить предварительную обработку, чтобы настроить этот метод? Одна из возможностей, которую я рассмотрел, – это использовать алгоритм прореживания, предложенный этим сообщением , но я не буду пытаться реализовать его, если это не изменит ситуацию.

Solutions Collecting From Web of "Предложения по распознаванию цифр"

Я взял класс с одним из суперзвезд компьютерного зрения, который был / находится на вершине рейтинга алгоритмов распознавания цифр. Он был действительно непреклонен, что лучший способ распознавания цифр – это …

 1. Get some hand-labeled training data. 2. Run Histogram of Oriented Gradients (HOG) on the training data, and produce one long, concatenated feature vector per image 3. Feed each image's HOG features and its label into an SVM 4. For test data (digits on a sudoku puzzle), run HOG on the digits, then ask the SVM classify the HOG features from the sudoku puzzle 

OpenCV имеет объект HOGDescriptor , который вычисляет функции HOG . Посмотрите на этот документ, чтобы узнать, как настроить параметры функции HOG. Любая библиотека SVM должна выполнять эту работу … материал CvSVM который поставляется с OpenCV, должен быть в порядке.

Для учебных данных я рекомендую использовать базу данных рукописных цифр MNIST , которая содержит тысячи изображений цифр с данными о земной истине.

Немного более сложная задача состоит в том, чтобы нарисовать ограничивающий прямоугольник вокруг цифр, которые появляются в природе. К счастью, похоже, что вы уже нашли стратегию для создания ограничивающих прямоугольников. 🙂

Самое простое – использовать Normalized Central Moments для распознавания цифр. Если у вас есть один шрифт (или очень похожие шрифты, он работает хорошо).

См. Это решение: https://github.com/grzesiu/Sudoku-GUI

В основном есть вещи, ответственные за распознавание цифр, извлечение, обучение моментам. При первом запуске приложения оператор должен предоставить информацию о том, какой номер отображается. Затем моментам изображения (извлеченному квадрату roi) присваивается номер (ввод оператора). База приложений по сравнению моментов.

Здесь первый фильм на YouTube показывает, как работает приложение: http://synergia.pwr.wroc.pl/2012/06/22/irb-komunikacja-pc/