Распознавание OCR с помощью openCV

Я пытаюсь создать более простой механизм распознавания текста, используя openCV. У меня есть это изображение: https://dl.dropbox.com/u/63179/opencv/test-image.png

Я сохранил все возможные символы как изображения и пытаюсь обнаружить эти изображения во входном изображении.

Отсюда мне нужно идентифицировать код. Я пытался обнаружить MatchTemplate и FAST. Оба, кажется, терпят неудачу (или более вероятно: я делаю что-то не так).

Когда я использовал метод matchTemplate, я нашел края как входного изображения, так и опорных изображений, используя Sobel. Это обеспечивает рабочий результат, но точность недостаточно хороша.

При использовании метода FAST кажется, что я не могу получить какие-либо интересные описания от метода cvExtractSURF.

Любые рекомендации о том, как лучше всего читать этот вид кода?

ОБНОВЛЕНИЕ 1 (2012-03-20)

У меня был некоторый прогресс. Я пытаюсь найти ограничивающие строки символов, но шрифт матрицы убивает меня. Смотрите образцы ниже:

Мой шрифт: https://dl.dropbox.com/u/63179/opencv/IMG_0873.PNG

Мой шрифт заполнен: https://dl.dropbox.com/u/63179/opencv/IMG_0875.PNG

Другой шрифт: https://dl.dropbox.com/u/63179/opencv/IMG_0874.PNG

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

Есть идеи?

Обновление 2 (2013-03-21)

Хорошо, мне повезло с поиском ограничивающих рамок. Смотрите изображение: https://dl.dropbox.com/u/63179/opencv/IMG_0891.PNG

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

Я пытался использовать серфинг, но когда я пытаюсь извлечь дескрипторы с помощью cvExtractSURF для каждой ограничивающей рамки, я получаю 0 дескрипторов... Есть идеи?

Какой метод будет наиболее подходящим для использования, чтобы иметь возможность сопоставить ограничивающую рамку с эталонным изображением?

1 ответ

Вы идете трудным путем с FASt+SURF, потому что они не были предназначены для этой задачи. В частности, FAST обнаруживает угловые элементы, которые вездесущи в структуре от движения, но гораздо реже присутствуют в OCR.

Два предложения:

  1. может быть, построить вектор признаков из числа и местоположений ключевых точек FAST, я думаю, что oyu может быстро проверить, достаточно ли эти функции являются дискриминантами, и если да, обучить классификатор из этого
  2. (тот, который я выбрал бы сам) разделите ваши образцы изображений на меньшие квадраты. Вычислите только дескриптор SURF для каждого квадрата и объедините их все, чтобы сформировать вектор признаков для данного образца. Затем обучите классификатор с этими характеристическими векторами.

Обратите внимание, что опция 2 работает с любым дескриптором, который вы можете найти в OpenCV (SIFT, SURF, FREAK...).

Ответ на обновление 1

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

Ответ на обновление 2

На данный момент, вы вернулись к моему первоначальному ответу: SURF здесь будет бесполезен. Вместо этого стандартным способом является бинаризация каждого ограничивающего прямоугольника (до 0 - 1 в зависимости от фона / буквы), нормализация ограничивающего прямоугольника до стандартного размера и обучение классификатора отсюда.

В Интернете есть несколько уроков и постов в блогах о том, как распознавать цифры с помощью нейронных сетей или SVM, вам просто нужно заменить цифры буквами.

Ваша работа почти завершена! Обучение и использование классификатора утомительно, но просто.

Другие вопросы по тегам