Използване на оптично разпознаване на символи за идентифициране на номера на кредитни карти в
Наскоро започнахме да разработваме прототипно приложение, което ще бъде стъпка към ново, по-удобно поколение платежни системи - системи, които използват незабавно въвеждане от потребителя. Идеята за приложението дойде по време на работа с card.io, уникален по рода си проект, чието разработване ви позволява да четете броя и датата на валидност на кредитните карти през камерата на мобилно устройство. Перспективата ни завладя: ако добавите тази функция към приложенията за плащане, колко по-лесно и по-бързо ще бъде процесът на закупуване. И решихме да разработим свой собствен аналог.
Към днешна дата е направено много, но проектът все още не е завършен: на етапа на локализиране на номерата се сблъскахме с определени трудности, по решението на които продължаваме да работим сега.
Резюме на Проекта
Задачата на проекта е да разработи алгоритъм за разпознаване на номерата и датите на банковите карти чрез камерата на мобилните устройства.
Работата се проведе на четири етапа:
- заснемане на изображение на карта
- локализация - търсене на предложена област с текст в изображението
- сегментиране - нарязване на локализиран текст на отделни числа
- разпознаване на цифри
Основната трудност на задачата е, че за разлика от обикновения текст, релефните числа не контрастират с фона. В допълнение, много карти имат чертежи, които се пресичат и шумят текст. Новите карти, с техните номера, покрити със сребърна боя, се четат сравнително добре. Старо, износено - по-лошо.
Друг проблем е силното влияние на осветлението: при рязко насочена странична светлина оригиналната картина се оказва една, с дифузна челна светлина, друга.
За човешкото око и мозък тези характеристики не са проблем, но, за съжаление, нямаме излишните 100 милиарда неврони на човешкия мозък, а за цифрово оптично разпознаване тези характеристики се оказаха сериозно предизвикателство.
Има и положителни аспекти: малък диапазон от знаци - от 0 до 9, без букви; всички карти използват един и същ шрифт, където всяко число се откроява добре от другата, тоест седемте не е като едната и т.н.
Изпълнение
Заснемане на изображение на карта: обработка на кадри от камера
Етап 1. Вземете изображението в сивата скала и запишете тези стойности в алфа канала на получената текстура.
Също така оставяме оригиналните RGB канали, за да покажем на потребителя цветно изображение в края.
Етап 2. Изберете граници.
От работния поток на приложението потребителят трябва да заснеме картата в рамката в определени определени области, за да заснеме. За да се ускори заснемането, областите имат определен марж, "люфт", тоест потребителят не трябва да поставя картата точно според маркировките, следователно в заснетото изображение има някои отклонения на картата от маркировките са възможни както в перспектива, така и в ъгъла на наклона и мащаба.

Изглед от приложението: заснемете банкова карта през камерата на iPhone
Задаваме необходимите области, като използваме текстура с маска на площ: области с вертикални граници - зелен канал, хоризонтални граници - червен.

Пример за маска
За да намерим границите на картата, ние избираме всички граници в дадените области с помощта на оператора Sobel. Във вертикалните области използваме хоризонталната производна на яркостта, а в хоризонталните - вертикалната. По този начин ние избираме само хоризонтални или вертикални граници в съответните области.

Резултатът от шейдъра
Заснемете изображение на картата: Намерете линии
След подготвителния етап за идентифициране на границите, трябва да намерим границите на картата и да подравним заснетата карта по тези граници, тъй като улавянето, както е описано по-горе, за удобство на потребителя се извършва грубо.
Задачата на този етап е да намери линиите на границите на картата и да получи техните уравнения, както и да изчисли точките на пресичане. Познавайки уравненията на линиите и точките на пресичане, можете да коригирате перспективата на картата, отместването и мащаба, да подравните картата по отношение на оста на абсцисата, т.е. програмно да я поставите точно върху етикетите.
За целите на прототипа беше решено да се използва готовата библиотека OpenCV и нейните методи за намиране на редове с помощта на пространството Hough Line Transform. В допълнение, ние също използвахме тази библиотека за адаптивна бинаризация на границите, получени по-горе. В бъдеще планираме да напишем алгоритми за тези задачи ръчно, използвайки графичен процесор, за да получим приемлива производителност.
Мобилният порт (iOS) на OpenCV не поддържа графични процесори и производителността на тази рамка спрямо предишния етап на обработка на графичния процесор е доста ниска. Следователно, за обработка с OpenCV, намалихме оригиналното изображение с линейни размери. След като получим информация за линиите в декартови координати, няма да ни е трудно да ги приведем до размерите на оригиналното изображение.