2013-03-19 4 views
0

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

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

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

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

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

Любые рекомендации по наилучшему способу чтения такого кода?

UPDATE 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? Если я могу найти ограничительную рамку каждого персонажа, было бы гораздо проще распознать персонажа.

Любые идеи?

Update 2 (2013-03-21)

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

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

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

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

ответ

4

Вы столкнулись с трудностями с FASt + SURF, потому что они не были предназначены для этой задачи. В частности, FAST обнаруживает угловые объекты, которые являются ubiquituous iin structure-from-motion, но гораздо менее присутствуют в OCR.

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

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

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

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

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

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

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

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

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

+0

Хорошо, я найду меньше и больше прямоугольников, так что я получу один прямоугольник вокруг каждой точки. Затем я буду измерять расстояние между точками, и если расстояние достаточно мало, я объединю прямоугольники. Таким образом, я должен был бы найти окружающий прямоугольник почти всего персонажа. Когда у меня есть прямоугольник, который достаточно близко, я буду использовать его для обучения приложения, и я, вероятно, смогу сопоставить буквы. Похоже на хороший подход? –

+0

Если вы немного размываете свое изображение, то небольшой трюк, который я описал в обновлении, должен работать напрямую, не учитывая расстояния в точках. Кроме того, добавление предшествующего размера рамки может быть более надежным, чем то, что вы предлагаете (google для «одиночной связи», чтобы увидеть преимущества и риски при рассмотрении расстояний в точках). – sansuiso

+0

Я сделал некоторый прогресс. См. Обновление 2. –

Смежные вопросы