Перейти к содержимому
Compvision.ru
VironZizu

Распознавание текста паспорта, OpenCV!

Recommended Posts

Спасибо Smorodov, тоже нашел уже!)

Смотрю на примерах С++ работают с внутренними и внешними контурами через hierarchy, но блин в враппере нету такого параметра у этого метода, хотя параметр ContourRetrieval.CComp для чего то же сделали!? в общем всю голову сломал с этими контурами уже)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В общем ход такой, практически всё лишнее нормально удаляется с помощью контуров!

1)Но вариант с точки зрения адаптивности не очень хорош, так как параметры задаются в ручную и если допустим в паспорте попадется нужный мне текст с шрифтом размеров с мелкий шрифт ("Дата выдачи" и тд), то он тоже замажется, что не очень хорошо.

2) Потом есть еще не приятный момент, на некоторых паспортах нужные надписи налазиют на "Дата выдачи" и тд, тоже не понятно как в таких случаях поступать...

3) Бывает печать налазиет на "Дата выдачи" и тд и получается что контур увеличивается и эта клякса остается

По хорошему нужно ещё запустить дополнительный уровень проверок, но каких именно, есть идеи?) по цвету? по геометрическому расположению?

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ребят, что это за алгоритм такой адовый, вот сижу смотрю и ума не приложу как он отрабатывает!? даже кавычку не тронул)) мой сносит всё подряд, похоже на Dilate, но точно не он, так бы все подряд уменьшил!Может у вас какие догадки есть? а то уже час в эту картинку впяливаюсь))

post-6983-0-48491400-1409798513_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что алгоритм скушал?

Только бинаризованное изображение, приведенное сверху?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov

ну изначально на вход идет цветное изображение! Думаете они через цвет взаимодействовали?

Как они так все помехи по убирали и при это даже те помехи которые на буквы наложились!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

А можно по подробней? про сегментацию!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Уже приводился в теме пример с cv::EM. Также можно k-means использовать.

На вход этим сегментаторам подавать, например, яркость и цвет (из того же HSL или HSV) пространства. Тогда должны попиксельно выделиться именно части текста.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно обучить две многокомпонентные модели, одну на фон, другую на текст.

likelihood = em_model.predict( sample )[0];

Будет выдавать значение функции правдоподобия модели для данного пикселя.

У какой модели правдоподобие больше, тот класс пикселю и присваивается.

Для обучения нужно самому ручками отметить текст и фон (например бинарной маской).

При обучении одной модели скармливать только пиксели фона, другой модели только пиксели текста.

Как он это разобьет на кластеры уже не так важно, важно количество кластеров, думаю 2-5 кластеров на каждый класс, разумный интервал для тестирования.

Реализацию обучения нескольких классов можно посмотреть в примере points_classifier.cpp строчка 465.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

с k-means довелось немного по играться, благо был пример в врапере.

Собственно удалось картинку отчистить, получаю только нужный текст. Тут всплыла очередная проблема) Tesseract отлично получает изображения слов, но очень плохо делит слова на буквы, особенно если эти буквы "слипшиеся" , так вот, есть какой нибудь алгоритм деления слова на буквы!? Может у OpenCV что-нибудь есть? Читал блог Abby на хабре, но там все к сожалению в очень размытых чертах описано...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно попробовать посчитать гистограммы как здесь показано:

http://stackoverflow.com/questions/12764624/word-segmentation-using-opencv

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По делил буквы средствами того же tesseract, результат ужастный, вернее делит то хорошо, но распознает потом эти символы просто убого... не знаю с какой ещё стороны к нему подойти

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может обучить свою нейронную сеть, на распознавание букв и цифр?

Шрифт - то ведь стандартный.

Здесь есть пример: http://www.compvision.ru/forum/index.php?showtopic=1552 (пост №6, второй спойлер)

Да вроде как и tesseract можно учить (не работал с ним, но вроде видел упоминания).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может обучить свою нейронную сеть, на распознавание букв и цифр?

Шрифт - то ведь стандартный.

Здесь есть пример: http://www.compvision.ru/forum/index.php?showtopic=1552 (пост №6, второй спойлер)

Да вроде как и tesseract можно учить (не работал с ним, но вроде видел упоминания).

Обучать свою нейронную сеть получится слишком долго по времени, решил попробовать обучить tesseract, скачал jtesseract, правда пока не могу разобраться с ним))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ничего не сказано про:

1. изменяется ли масштаб при сканировании паспорта.

2. возможен ли поворот.

3. разные ли сканеры и какого разрешения скан.

и т.д.

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

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

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

примерно

http://habrahabr.ru/post/123395/

еще можно погуглить по "opencv ocr"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Интересно как они делают шаг "Удаление шума"?

Вполне может быть что-то типа swt. Я бы ещё посмотел на результат всяких медианных и билатеральных фильтров на этом паспорте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно еще попробовать в частотной области поэкспериментировать (в спектре Фурье), фоновый рисунок где-то примерно на одной частоте.

Может удастся его выковырять удалив участки спектра.

Ну вот что то типа такого:

http://stackoverflow.com/questions/20531110/removing-pattern-and-noise-in-an-image-using-fft-in-matlab

или вот:

http://www.fmwconcepts.com/misc_tests/FFT_tests/

fft-example.gif

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ничего не сказано про:

1. изменяется ли масштаб при сканировании паспорта.

2. возможен ли поворот.

3. разные ли сканеры и какого разрешения скан.

и т.д.

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

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

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

примерно

http://habrahabr.ru/post/123395/

еще можно погуглить по "opencv ocr"

1) масштаб не меняется, все сканится с разрешением 300dpi

2) поворот пока не рассматриваю, пытаюсь сделать для идеального варианта!

3) сканеры примерно одной серии в идеале у них будут схожие настройки, в общем отталкиваемся от того что сканеры одинаковые!)

 

Остановился на том, что выдаю впринципе нормальное бинаризованное изображение с нужным текстом в tesseract, сейчас главная проблема - не распознается должным образом слипшийся текст! Пытался его разделять средствами того же tesseract  а потом распозновать по одной букве с опцией PageSegMode.SingleChar но результаты стали даже хуже чем при переводе всего текста разом! И вот здесь у меня полное замешательство, куда двигаться дальше!? Толи пытаться обучить tesseract распознованию слипшегося текста, но не факт что у него это получится, толи писать свой алгоритм разделения слова на буквы, но тут опять же не факт распознает ли tesseract по одной букве, даже идеально выделенной, судя по моему примеру предыдущему тоже далеко не факт...

 

Интересно как они делают шаг "Удаление шума"?

 

Тоже очень интересно, выше писал такой же вопрос)

 

з.ы. форум так преобразился, что у меня аж пост стерся))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эмм... извиняюсь, что режу по живому, но сейчас все должно работать. 

 

Больше так не буду rolleyes.gif .

 

Решил апгрейд сделать к 10000-му посту.

 

ЗЫ: рейтинги никуда не пропали, просто я их еще не вывел наружу (подумаю как не разломать ими весь дезигн smile.png Может и не буду этого делать, тут лайки есть :) ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Думаю, что разделение слипшегося текстта надо делать своё. Можешь по быстрому попробовать этот вариант: http://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/#more-476

 

2. В качестве распознавалки отдельных символов я голосую за самостоятельно обученный классиификатор, не tesseract.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

P.S. По новому дизайну сайта: нравится. Но не хватает двух вещей:

1. возможности правки сообщения;

2. гиперссылки, которая отображается не полностью как вся длиннющая ссылка, а в виде пользовательского текста.

Может, я просто не нашёл, как сделать эти две вещи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Оффтоп, конечно, потом удалю или перенесу.

 

Я сам пока разбираюсь с новой версией форума.

 

Управление своими темами добавил.

 

Ссылки вставляются в редакторе кнопкой в тулбаре.

Выделяется текст, нажимается кнопка, вводится url и получается вот так: Compvision.ru .

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×