суббота, 14 января 2012 г.

Распознавание каптчи

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

Функция сравнивания изображений:

function compare(imag1, imag2: TBitmap):boolean;
var i, q, rez, trh, p1, p2:integer;
begin
rez:=0;
trh:=1000000; //чувствительность
result:=false;
for i:=1 to Imag1.width do
  for q:=1 to Imag1.height do begin
    p1:=Imag1.Canvas.pixels[i,q];
    p2:=Imag2.Canvas.pixels[i,q];
    rez:=rez+sqr(GetRValue(p1)-GetRValue(p2));
    rez:=rez+sqr(GetGValue(p1)-GetGValue(p2));
    rez:=rez+sqr(GetBValue(p1)-GetBValue(p2));
  end;
 result:=rez<trh;
end;

В этой функции мы получаем цвет пикселя с помощью GetRValue, GetGValue, GetBValue и получившиеся значения складываем.
В самом конце проверяем, если различия в цвете и точках не большие, то картинки одинаковые!


Пользоватся этой функцией так:


compare(эталонное изображение, с чем сравнивать)


Функция возвратит TRUE если изображения одинаковые.

В качестве бонуса:
Программа которая получает ICQ номер;
Способ получения каптчи от Google



Работает через этот сайт

Код получения каптчи с Google:

var link, page, str:string; FF:TFileStream;

 page:=idHTTP1.Get('http://www.asya-besplatno.ru/icq-registraciya/'); //загружаем код страницы
  str:=Pars('src="http://www.google.com', page, '">'); //парсим значение
  link:='http://www.google.com'+str; //формируем ссылку

 page:=idHTTP1.Get(link);
  str:=Pars('challenge : ''', page, ''',');
  capa:=str; //копируем параметр challenge в глобальную переменную.
  link:='http://www.google.com/recaptcha/api/image?c='+str;

 FF:=TFileStream.Create('cap.jpg',FMCreate); //создаём изображение
 idHTTP1.Get(link, FF); //загружаем его

 FF.Free; //очищаем переменную
 Image1.Picture.LoadFromFile('cap.jpg');//Загружаем каптчу
DeleteFile('cap.jpg'); //удаляем каптчу

Хочу сказать, что данный способ очень эффективен т.к. в случае если на картинке будет некий шум (точка или что ещё), программа не забракует изображение!
Если бы мы сравнивали каждый пиксель, то при малейшем шуме программа забраковала бы изображение.

Исходник и программу к статье можно скачать по этой ссылке.

Программа написана на Delphi 2010

10 комментариев:

  1. Не распознает пассы :(

    ОтветитьУдалить
    Ответы
    1. В Английском алфавите 26 букв.
      В пароле есть строчные и заглавные, по этому в общем мне пришлось бы собрать 52 картинки + цифры. Я этого делать не стал.
      И не забывайте что это пример программы.

      Удалить
  2. VanS напиши плиз полностью программу что бы и пароль расспознавала!!! БУДЕМ ВСЕ БЛАГОДАРНЫ!

    ОтветитьУдалить
    Ответы
    1. Даже не знаю как сказать...
      В общем программа как ДОПОЛНЕНИЕ или ПРИМЕР к статье!

      Удалить
  3. Что-то близко нет распознавания капчи, не сходиться с темой :)

    ОтветитьУдалить
    Ответы
    1. Текст на картинке можно считать каптчей.

      Удалить
  4. Парсинг данных, получение капчи. Распознавание каптчи, это другая статья =)

    ОтветитьУдалить
  5. Анонимный9 мая 2013 г., 15:41

    Ванс, ты разве не поклонник Delphi 7? А тут бац, и 2010

    ОтветитьУдалить
    Ответы
    1. Вроде там гифки или png картинки.

      Удалить
  6. А с этого сайта капчу можно расшифровать? http://advance-rp.ru/login.html

    ОтветитьУдалить