Уже пару месяцев прошло после того как я внедрил в miniPoster функционал для разгадывания капчи через эталоны, эксперимент оказался удачным, поэтому пришла пора написать о нем тут)
Что такое эталон? — это копия символа на изображении, она хранится в базе, после разделения капчи на символы, они сверяются по этой базе эталонов и где больше совпало, тот и результат.
Эталоны я храню в строке в виде 0 и 1, 0 — белый пиксель, 1 — черный. также для ускоренного поиска по базе я прикрутил метод дырки и метод начала и конца, по которым я определяю наличии дырок(+их количество) а тек же начало и конец символа, тоесть получилась следующая структура
QString img; QChar result; int CountHole; int Start; int End;
Благодаря CountHole,Start,End я могу при поиске сразу отсеивать картинки да бы не тратить лишний раз время на сравнения строк QString img, таким образом время на поиск даже в огромной базе в 1000 эталонов занимает доли секунды.
Сбор эталонов.
Первой проблемой стал вопрос, а сколько их собирать? Решение было следующие, капча перебирается в цикле и заносится в базу, но если такая капча там уже есть или есть похожая хотя бы на 90%(параметр можно выбирать самому) то естественно такое изображение добавлено не будет, в коде есть счетчик, если 30 итераций цикла подряд не было занесено в базу изображение, значит добавлять уже хватит.
Нус.. перейдем от теории к практике.
Берем подобную капчу
Очищаем от мусора на фоне, делим на символы
[LOAD_CAPTCHA][http://rewbux.com/captcha2.php] [COLOR_TRESHOLD][128] [SPLIT_CIRCUIT]
Дальше создаем эталоны
[START_MAKE_MODEL] [LOAD_CAPTCHA][http://rewbux.com/captcha2.php] [COLOR_TRESHOLD][128] [SPLIT_CIRCUIT] [END_MAKE_MODEL]
вышло у нас аж 168 штук, далее немного рутиной работы, нужно переименовать изображения и вместо символа n поставить значение на картинке,
Вызываем функцию[COMPLETE_MAKE_MODEL] и получаем 1 маленький файлик со всеми нашими эталонами.
Все, давайте проверим результат,
[BREAK_POINT][dd] [LOAD_CAPTCHA][http://rewbux.com/captcha2.php] [COLOR_TRESHOLD][128] [SPLIT_CIRCUIT] [FIND_ARRAY_IMG_IN_MODEL_LIST][result.model] [COPY_FILE][captcha/$MODEL_NAME_captcha.png][captcha/testModel/$IT_$captcha.png] [GO_TO_BREAK_POINT][dd][50]
Результат 100%)
метод дырки и метод конца
смайлики в конце обрезало
точно уже не помню побеждал ли я эту капчу, скрипт просто подсчитывал площадь символа, для 6 и 9, и еще при совпадениях площадей, делались небольшие доп. проверки.