читать цифры и буквы с изображения с помощью openCV - PullRequest
20 голосов
/ 16 января 2011

Я занимаюсь разработкой приложения для чтения букв и цифр из изображения с использованием opencv в c ++.Сначала я изменил данное цветное изображение и цветовой шаблон на двоичное изображение, затем вызвал метод cvMatchTemplate ().Этот метод просто выделил области, где шаблон соответствует .. Но не ясно .. Я просто не хочу видеть область .. Мне нужно проанализировать символы (буквы и цифры) из изображения.Я новичок в openCV.Кто-нибудь знает какой-либо другой метод, чтобы получить результат ??

alt text

Изображение взято с камеры.Образец изображения показан выше.Мне нужно получить все тексты со светодиодного дисплея (130 и Delft Tanthaf).

Друзья, которые я пробовал с примером приложения распознавания лиц, Он распознает лица.файл HaarCascade предоставляется вместе с openCV.Я только что загрузил этот файл и вызвал метод cvHaarDetectObjects ();Для обнаружения букв я создал xml-файл с помощью приложения letter_recog.cpp, предоставленного openCV.Но когда я загружаю этот файл, он показывает некоторую ошибку (ошибка OpenCV: неизвестная ошибка> в неизвестной функции, файл ........ \ ocv \ opencv \ src \ cxcore \ cxpersistence.cpp, строка 4720).Я искал в сети эту ошибку и получил информацию об используемых файлах lib.Я так и сделал, но ошибка все еще остается.Это ошибка с моим XML-файлом или вызов метода для загрузки этого XML-файла ((CvHaarClassifierCascade *) cvLoad («имя встроенного XML-файла», 0,0,0);) ??ПОМОГИТЕ пожалуйста ...

Заранее спасибо

Ответы [ 5 ]

16 голосов
/ 20 ноября 2013

Начиная с OpenCV 3.0 (в активном dev), вы можете использовать встроенный модуль обнаружения объекта «сцены» ~

Обнаружение текста построено на следующих двух документах:

  • [Neumann12] Neumann L., Matas J .: Локализация текста сцены в реальном времени и признание, CVPR 2012. Документ доступен в Интернете по адресу http://cmp.felk.cvut.cz/~neumalu1/neumann-cvpr2012.pdf

  • [Gomez13] Гомес Л. и Каратзас Д .: Извлечение текста из нескольких сценариев из Природные сцены, ICDAR 2013. Документ доступен в Интернете по адресу http://refbase.cvc.uab.es/files/GoK2013.pdf

Как только вы выяснили, где находится текст в сцене, вы можете запустить любой тип стандартного распознавания текста для этих срезов (распознавание Tesseract обычно). И теперь в opencv есть сквозной пример с использованием нового интерфейса OpenCV к Tesseract:

9 голосов
/ 11 декабря 2012

Сопоставление шаблонов, как правило, не является надежным для такого рода приложений из-за несоответствий освещения, изменений ориентации, изменения масштаба и т. Д. Типичным способом решения этой проблемы является внедрение машинного обучения. То, что вы пытаетесь сделать, обучая свой собственный повышающий классификатор, является одним из возможных подходов. Тем не менее, я не думаю, что вы делаете обучение правильно. Вы упомянули, что дали 1 логотип в качестве положительного тренировочного изображения и 5 других изображений, не содержащих логотип в качестве отрицательных примеров? Как правило, вам нужны обучающие образцы порядка сотен или тысяч и более. Вы не можете тренироваться с 6 тренировочными образцами и ожидать, что это сработает.

Если вы не знакомы с машинным обучением, вот примерно что вы должны сделать:

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

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

См. Следующую ссылку о том, как обучить каскад классификатора и создать файл модели XML: http://note.sonots.com/SciSoftware/haartraining.html

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

Надеюсь, это поможет.

EDIT:

Я случайно наткнулся на этот старый пост после отдельного открытия текстового модуля сцены в OpenCV 3, упомянутого @ KaolinFire.

Для тех, кому интересно, это результат запуска этого детектора на образце изображения, заданном ОП. Обратите внимание, что детектор может локализовать текстовую область, даже если он возвращает более одной ограничительной рамки.

Result of OpenCV 3 text detector.

Обратите внимание, что этот метод не является надежным (, по крайней мере, эта реализация в OpenCV с параметрами по умолчанию ). Это имеет тенденцию генерировать ложные срабатывания, особенно когда входное изображение содержит много «отвлекающих факторов». Вот еще примеры, полученные с использованием этого детектора текста OpenCV 3 в наборе данных Google Street View:

Negative result 1 Negative result 2 Negative result 3 Negative result 4

Обратите внимание, что он имеет тенденцию находить «текст» между параллельными линиями (например, окна, стены и т. Д.).Поскольку входное изображение OP, скорее всего, будет содержать сцены вне помещения, это будет проблемой, особенно если он / она не ограничивает область интереса меньшей областью вокруг светодиодных знаков.

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

Вот ещересурсы (обсуждение + код + наборы данных) по обнаружению текста.

Код

Наборы данных

Здесь вы найдете Google StreetView и наборы данных MSRA.Хотя изображения в этих наборах данных не совсем совпадают с изображениями светодиодных знаков на шинах, они могут быть полезны либо для выбора «наилучшего» алгоритма выполнения из нескольких конкурирующих алгоритмов, либо для обучения алгоритму машинного обучения с нуля.

http://www.iapr -tc11.org / mediawiki / index.php / Datasets_List

5 голосов
/ 16 января 2011

См. Мой ответ на Как прочитать время с записанного видео с камеры наблюдения? Вы можете / должны использовать cvMatchTemplate() для этого.

1 голос
/ 09 мая 2011

Если вы работаете с фиксированным набором шинных назначений, подойдет шаблонное сопоставление.

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

0 голосов
/ 07 марта 2019

Вы также можете посмотреть на EAST: эффективный детектор текста сцены - https://www.learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/ По этой ссылке у вас есть примеры с C ++ и Python. Я использовал этот код для определения количества шин (после обнаружения того, что данный объект является шиной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...