Подтвердить что ты не робот

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

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

enter image description here

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

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

enter image description here

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

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

Ответ 1

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

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 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. Любая библиотека SVM должна выполнять эту работу... CvSVM материал, который поставляется с OpenCV, должен быть в порядке.

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

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

Ответ 2

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

Посмотрите это решение: https://github.com/grzesiu/Sudoku-GUI

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

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