Распознавание 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.
Два предложения:
- может быть, построить вектор признаков из числа и местоположений ключевых точек FAST, я думаю, что oyu может быстро проверить, достаточно ли эти функции являются дискриминантами, и если да, обучить классификатор из этого
- (тот, который я выбрал бы сам) разделите ваши образцы изображений на меньшие квадраты. Вычислите только дескриптор SURF для каждого квадрата и объедините их все, чтобы сформировать вектор признаков для данного образца. Затем обучите классификатор с этими характеристическими векторами.
Обратите внимание, что опция 2 работает с любым дескриптором, который вы можете найти в OpenCV (SIFT, SURF, FREAK...).
Ответ на обновление 1
Вот маленький трюк, которому меня научили старшие люди, когда я начинал. На вашем изображении с точками вы можете проецировать ваши двоичные данные на горизонтальную и вертикальную оси. Ища дыры (разъединения) в проецируемых шаблонах, вы, вероятно, восстановите почти все поля boudnig в вашем примере.
Ответ на обновление 2
На данный момент, вы вернулись к моему первоначальному ответу: SURF здесь будет бесполезен. Вместо этого стандартным способом является бинаризация каждого ограничивающего прямоугольника (до 0 - 1 в зависимости от фона / буквы), нормализация ограничивающего прямоугольника до стандартного размера и обучение классификатора отсюда.
В Интернете есть несколько уроков и постов в блогах о том, как распознавать цифры с помощью нейронных сетей или SVM, вам просто нужно заменить цифры буквами.
Ваша работа почти завершена! Обучение и использование классификатора утомительно, но просто.