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

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

Recommended Posts

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

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


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

Есть вариант применить перед бинаризацией какой-нибудь анизотропный фильтр. 

см. Bilateral filter, guided filter, anisotropic diffusion.

Билатеральный в OpenCV имеется, надо только параметры правильно подобрать.

 

Есть еще хитрый увеличитель картинок:

 

И вот еще одна моя реализация: 

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


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

Можешь ещё попробовать применить CLAHE, тоже есть в OpenCV. Он правда больше для визуального восприятия, но, возможно, и тебе поможет.

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


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

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

Мне для распознавания символов больше всего подошел Christian, правда его нет в OpenCv.

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


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

Не мудрено что Отцу плохо работает, ведь он вычисляет 1 порог собирая статистику со всего изображения, т.е. это глобальная бинаризация.

 

thresh_2.png

(плохо работает в случаях если с одного конца документа например пересвет или затемнение)

 

 

А надо использовать локальную.  

http://fiji.sc/Auto_Local_Threshold

 

 

а вообще это всё пляски с константами, надо использовать обучаемую сегментацию.

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


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

С этапом бинаризации более менее разобрался, применил Адаптивную, она как то лучше с градиентными картинками справляется!

И решил я тут отталкиваться от позиции паспорта, т.е. найти его на картинке, задача оказалась не тривиальной.

 

Мой алгоритм ищет все прямоугольные области, потом отсеивает по размеру нужную. Алгоритм нахождения прямоугольников брал здесь:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

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

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


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

Для текста на однородном фоне часто используют гистограммы по строкам и по столбцам. То есть после бинаризации (можно и до):

1. создай одномерный массив размером с число строк изображения;

2. найди сумму пикселей в каждой строке и присвой соответствующему элементу массива;

3. нормализуй результат;

4. выведи его.

Будут пики и провалы, которые точно соответствуют положению текста и границам паспорта.

Такую же процедуру повтори для столбцов.

 

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

Единственное, о чём надо помнить: паспорт либо сам должен лежать практически идеально ровно под сканером, без поворотов и изгибов, либо надо предварительно искать его границы и выравнивать.

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


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

Я видимо не совсем так расписал!)

Мне нужно на отсканированном изображении, найти сам паспорт

Вот пример:

Мой алгоритм вроде находит, но стоит положить паспорт к кромке сканера, алгоритм перестает работать...

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


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

Нарисуйте рамку в пару пикселей вокруг изображения (после Canny), должно помочь.

 

PS: Блюррить изображения довольно плохой способ защиты smile.png

http://svg.dmi.unict.it/iplab/imagej/Plugins/Forensics/OpticalDeblur/Optical%20deblur.html

http://www.pcworld.com/article/2032916/review-smartdeblur-restores-blurred-images-indulges-csi-fantasies.html

https://github.com/Y-Vladimir/SmartDeblur

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


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

вообще в opencv был пример find rect(или как то так), основанный на нахождение 4-х линий методом  преобразования Хоуга (Hough) ,а потом ищут их пересечение, и смотрят близок ли угол к 90.

 

тут правда используется approxPoly

http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp

http://opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/

 

хотя тут легче просто отделить от фона по цвету(если он отличается от цвета паспорта) и найти прямоугольный блоб.

или так http://stackoverflow.com/questions/23234515/find-and-draw-largest-rect-opencv

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


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

Smorodov

Сейчас попробую!

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

p/s/ а про блюр не знал, спасибо!)) сразу все по удалял со страху))

 

mrgloom

С Хоугом по игрался немного, нужные мне линии он отказался находить, реализовал через approxPoly! Проблемы возникают когда паспорт рядом с кромкой кладешь! Вот сейчас опробую совет Smorodova!) Правда остается проблема, если уголки страницы загнуты!

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


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

Ребят, такой вопрос, если у меня паспорт допустим лежит под углом небольшим, у меня есть линия, по которой можно выровнять изображение, как это можно сделать? Rotate то я делать умею, а вот как угол узнать? Если у меня есть координаты границ паспорта?

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


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

Через atan2, phi=atan(dy,dx); выдаст угол в радианах, opencv при составлении матрицы поворота, как мне помнится, использует градусы, так что не забудьте перевести.

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


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

Smorodov

Спасибо за наводку про atan2! Все отлично получилось)

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

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


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

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

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


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

По поводу поворота: https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0

 

По поводу верх / низ, можно ведь находить лицо smile.png

Подетектил, не нашел, перевернул, опять подетектил.

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


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

Про матрицу поворота спасибо! Нашел шикарный способ как с её помощью нужные мне точки повернуть!))

 

А вот про поиск лица я как то и не задумывался раньше, сейчас опробую, тут в примере есть, самому интересно!)) Другое дело, что как обычно наверняка кроме лица еще кучу мусорных обектов найдет))

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


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

Так надо самый большой объект искать (с флагом что то типа findLargestObject).

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


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

Собственно как и ожидалось, выдал кучу ложных областей, причем они были ничуть не меньше нужной, да и выполнялся он 1.5сек, а это уже перебор наверное, алгоритм и так уже 4 сек отрабатывает!)) боюсь что дальше будет))

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


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

1.5 секунды много, обычно реалтайме работает. Можно уменьшить изображение, искать только в верхней левой четверти. 

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


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

Вроде как сделал переворот, но как то он мне не нравится, не красиво реализован чтоли, пока так кончено оставлю, но в планы себе запишу более удачно реализовать! Ребят, а такой вопрос, реально каскады Хаара обучить на нахождение паспорта на скане? Чисто случайно наткнулся на него, очень интересный вариант, просто время реализовать уже нет. Прочитал пару статей на хабре, очень занимательно! Может уже есть где-нибудь обучные xml? пока только на лица находил и на автомобильные номера. На лица у меня отрабатывает так себе, много мусора, так может с прямоугольными областями у него лучше получится?)

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


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

Конечно реально. Я как-то обучал каскады на поиск банковских карточек, а там всё поосложней.

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


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

А есть какой нибудь материал по обучению? в идеале на русском)) У меня есть пример реализации Хаара, но там xml файл лица ищет) а мне бы паспорта, может удасться переобучить)) и у него удасться даже наклоненные документы находить? прям грани показывать будет? или получится только приблизительная область с паспортом?

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


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

Материала на русском полно, достаточно погуглить. Наклоненные паспорта будет искать только лишь если ты в достаточном количестве включишь их в обучающую выборку. Грани показывать не будет, только лишь примерный прямоугольник.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×