Розпізнавання простий капчи gocr і php, stackoff

Розпізнавання простий капчи gocr і php, stackoff

При проходженні одного з завдань на програмування була дана капча. яку потрібно було розпізнати в перебігу 15 секунд. Вручну ввести дані нереально, оскільки складається вона з 96 символів, алфавітом є 16-ковий значення. Так, така ось довга капча 🙂 Але завдання тому і в гілці програмування, значить будемо вирішувати.

Зовні зображення виглядає так:

В гідність алгоритму генерації можна віднести дрібні символи і їх кількість. В іншому ж розгадати таку не складе труднощів. Розпізнавання даної капчи, як і будь-який інший у вигляді зображення можна виконати різними способами. Я вирішив скористатися готовою OCR. Це така штука, яка більшу частину роботи робить за нас. Провівши експерименти з різними софтом призначеним для оптичного розпізнавання символів, зупинився на gOCR. Дана програма існує під всі поширені операційні системи, але що більш приємно - є в репозиторіях Убунту (на якій побудований дистрибутив BackBox).

установка gOCR

Я звик користуватися менеджером пакетів APT, тому:

Встановивши гоцр, можна перевірити його працездатність виконавши в терміналі gocr <опции> / Шлях / до / зображенню

Оскільки в нашому випадку базою є значення 0-9 і a-f, задамо їх через параметр -C.

Розпізнавання простий капчи gocr і php, stackoff

Не погано. Успішно розпізнані майже всі символи за винятком четвірки, дев'ятки і нуля, які я виділив червоним. Можна було б залишити і так, але так справа не піде, залишати цю справу на rand () долі погана затія. Тому у нас є два шляхи:

  1. навчити gocr для точного розпізнавання проблемних символів
  2. використовувати свій варіант для корекції

Я вибрав другий шлях, оскільки займатися пошуком інформації про навчання gOCR'a бажання не було. Вибір припав на PHP і модуль GD.

Вирізавши 0, 4 і 9 в окремі файли я приступив до бидло КОДІНГ.

Для початку викличемо через shell_exec gocr і переведемо символи в масив.

Потім будемо проходити по отриманої рядку, і якщо ннаткнулісь на спірне символ, який може бути 0, 4 або дев'яткою - викликаючи нашу функцію getChar (позиція) передавши в якості аргументу позицію символу в рядку.

Завдання функції полягає в порівнянні шматка зображення, отриманого з повною капчи з усіма вирізаними мною символами вручну. Якщо кількість білих пікселів в обох шматках на однакових позиціях більше 8 штук, то Перезаписуємо $ answer [$ pos].

Під кінець виведемо результат після обробки.