среда, 6 июня 2012 г.

Распознавание каптчи. Часть 2

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


Попался мне данный сервис: anmase.ru.
Как только я туда зашёл - первым делом обратил внимание на каптчу, 6 цифр, искажение не присутствует да ещё и на одинаковом фоне!

Задача следующая:
1. Разрезать изображения на 6 частей.
2. Скопировать каждую часть в массив
3. Сравнить с эталонами.

Разрезать изображение на несколько частей - задача не простая, но решаема таким способом:

1. Найти начало первой цифры
2. Найти конец первой цифры
3. Скопировать цифру в массив

  • Постить сюда этот код я не буду т.к. он очень большой.

Пример разрезания каптчи:



Как видно (плохо но всё же) программа нашла границы цифр и выделила их.

Осталось только скопировать их:
procedure TForm1.cop;
var i, q, ok:integer;
begin
  for ok:=1 to 6 do begin
    for i:=ad[ok, 1] to ad[ok, 2] do begin
      for q:=0 to 40 do begin
        cap[ok].Width:=ad[ok, 2]-ad[ok, 1];
        cap[ok].Height:=40;
        cap[ok].Canvas.Pixels[i-ad[ok, 1], q]:=Image1.Canvas.Pixels[i, q];
      end;
    end;
  end;
end;

Эта функция копирует каждую цифру в отдельную ячейку массива.

После того как все цифры скопированы нам осталось только сравнить их:
procedure TForm1.recaptcha;
var ok, i, q, w, a:integer; n:boolean;
begin
Edit1.Text:='';
  for ok:=1 to 6 do begin
    n:=false;
    for a:=1 to 4 do begin
      for w:=0 to 9 do begin
        if cap[ok].Width=et[a, w].Width then begin
          if (compare(cap[ok], et[a, w])) and (not n) then begin
            Edit1.Text:=Edit1.Text+IntToStr(w);
            n:=true;
          end;
        end;
      end;
    end;
    if not n then Edit1.Text:=Edit1.Text+'x';
  end;
end;

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

function TForm1.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;

 Вот и весь "мозг" нашей программы.

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

Собирать эталонные изображения очень просто! После получения каптчи она делится на 6 частей и заносится в соответствующую ячейку массива, по этому сохранить будущий эталон очень просто:
cap[1].SaveToFile('1.bmp');
Вот так, постепенно мы соберём не большую коллекцию эталонных изображений, которые в последствие будут сравниваться (все сразу) с неизвестной на данный момент цифрой. На данный момент программа распознаёт ВСЕ цифры.

Видео работы программы:



На этом всё!

Скачать исходник:


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

  1. я хочу от тебя детей!

    ОтветитьУдалить
  2. А на ask.fm возможно капчу распознать?Там тоже на мой взглят она простая.

    ОтветитьУдалить
    Ответы
    1. Там искажения и буквы друг на друга наскакивают.

      Удалить
    2. Антигейд прикрути

      Удалить
  3. что за песня играет в прикрепленом видео?

    ОтветитьУдалить
    Ответы
    1. Lalo Project feat. Aelyn – Listen to me, Looking at me

      Удалить
  4. Извиняюсь за тупость,смысл вообще этой программы?

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

      Удалить
    2. это намек на финансирование?;D

      Удалить
  5. сделай спамер anmase.ru
    ПЛИЗЗЗЗЗЗЗЗЗЗЗ

    ОтветитьУдалить
  6. Не распознает уже, как переделать?

    ОтветитьУдалить
    Ответы
    1. Набрать новых эталонов. Тем более цифры/буквы не наскакивают друг на друга.

      Удалить
    2. Наискось становяться бывает, ничего не выходит. Нужно "Распознавание каптчи. Часть 3".

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

      Удалить
    4. VANS, будь добр, сделай исходники. Посмотрел видеомануалы Антона Макрушина "Взлом капчи", ну никак не получается. А ты какбэ, видимо уже набитый в этом.

      Удалить
    5. Стрёмно он объясняет...

      Удалить
    6. тоже смотрел,просто человек это делает ради удовольствия,а не ради наживы или чегото другого

      Удалить
  7. сменили каптчу специально для ванса:D

    ОтветитьУдалить
    Ответы
    1. Это вызов? Каптча сейчас ни чем не лучше той что была, ну да, пару секунд прибавит, но распознать её по по-прежнему можно!

      Удалить
    2. слушай ванс,как думаешь,в этой новой каптче можно обойтись без эталонов?,т.е. просто цыклом подсчитывать количество пикселей одным цветом,потом через case of анализировать и узнавать ответ?

      Удалить
    3. Можно, но только кол-во пикселей может совпасть с каким нибудь другим числом, например 6 совпадает с 9. Выход один - местоположения пикселей.

      Удалить
    4. еще вопрос,можно ли както анализировать каптчу яндекса?

      Удалить
    5. а какими методами?

      Удалить
  8. а сможеш сделать распознавание каптчи как на vk.com???

    ОтветитьУдалить
  9. А для самп рп сможеш сделать? Там даже 4 цифры)
    http://samp-rp.ru/%D0%90%D0%BA%D0%BA%D0%B0%D1%83%D0%BD%D1%82

    ОтветитьУдалить
  10. Было бы классно, если распознавание капчи работало бы на твоем prcr боте..

    ОтветитьУдалить
    Ответы
    1. Вы готовы финансово поддержать данную идею? Если да то я безусловно сделаю!

      Удалить
  11. Дайте компонент CenterEdit, пжл)

    ОтветитьУдалить
  12. Vans я тебе в скайп написал ответь

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