Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2014, 20:05   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Распознавание капчи

Привет.

Пытаюсь распознать очень простую капчу.


Подумал, что разумно будет сделать изображение черно-белым, но для начала его нужно перевести в формат bmp, чтобы с ним можно было работать, исходное изображение получаю PNG.

Код:
// из Png в bmp
procedure PNGFileToBitmap(const Source, Dest: String);
var
 Bitmap: TBitmap;
 PNG: TPNGObject;
begin
 PNG := TPNGObject.Create;
 Bitmap := TBitmap.Create;
 {In case something goes wrong, free booth PNG and Bitmap}
 try
   PNG.LoadFromFile(Source);
   Bitmap.Assign(PNG);    //Convert data into bitmap
   Bitmap.SaveToFile(Dest);
 finally
   PNG.Free;
   Bitmap.Free;
 end
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  FS: TFileStream;
  html: string;
  Fon,i,j: Integer;
begin
  idHTTP1:=TIdHTTP.Create(nil);
  idHTTP1.HandleRedirects:=true;
  idHTTP1.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201';
  idHTTP1.HandleRedirects:=True;
  idHTTP1.ReadTimeout:=5000;

  IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  idHTTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;

  
  // преобразовываем из одного формата в другой
  PNGFileToBitmap('captcha.png','captcha.bmp');


  // загружаем картинку на форму
  Image1.Picture.LoadFromFile('captcha.bmp');

  
  // Определяем цвет фона
  Fon:=Image1.Canvas.Pixels[0,0];
  
  // Перекрашиваем все не фоновые  пиксели в белые остальные в черные
  For i:=0 to Image1.Picture.Width do
    For j:=0 to Image1.Picture.Height do
      If Image1.Canvas.Pixels[i,j]=Fon then begin
        Image1.Canvas.Pixels[i,j]:=RGB(255,255,255);
      end
      else Image1.Canvas.Pixels[i,j]:=0;

  // очищаем память
  IdSSLIOHandlerSocketOpenSSL1.Free;
  IdHTTP1.Free;
end;
В итоге получаю картинку без изменений. В чем может быть дело? Или есть другие пути решения?

И еще интересует один момент, разве нельзя работать с изображением без TImage? Ведь готовый код будет использоваться в нескольких потоках и придется для каждого создавать компонент TImage.
bilibian вне форума Ответить с цитированием
Старый 16.07.2014, 21:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В итоге получаю картинку без изменений.
А каких изменений ты ожидал от простого пересохранения файла?
Цитата:
И еще интересует один момент, разве нельзя работать с изображением без TImage?
Можно. TBitmap класс для этого и создан. Я правда не в курсе как с PNG работать без GDI+, но по идее в новых Делфи уже и для PNG должен быть класс соответствующий.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2014, 22:56   #3
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

Может из-за того что размеры Image1 не задал?

Я обычно картинку вывожу на форму только после обработки, а до этого загружаю ее в отдельный Bitmap с которым и работаю. Так на много быстрее чем изменять картинку прямо на форме.
Что бы еще такого сделать, чтобы ничего не делать?

Последний раз редактировалось DpolenST; 16.07.2014 в 23:09.
DpolenST вне форума Ответить с цитированием
Старый 16.07.2014, 23:46   #4
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Не получалось сделать изображение черно-белый так как кодировал не так как надо. Сделал так: чтобы символы стали черными.

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

Вот только где хранить эталоны? В папке, а потом подгружать по одному во время сравнивания? Или есть вариант загрузить их все в прогу и проверить?
bilibian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распознавание капчи михончик Фриланс 0 27.03.2013 11:57
Распознавание капчи Незлобин Помощь студентам 2 18.05.2012 14:19
Распознавание капчи russian-stalker Свободное общение 9 13.02.2011 08:34
Распознавание капчи. Alex Cones Общие вопросы Delphi 20 11.01.2011 14:41
Распознавание капчи phpBB Оптимист2009 Свободное общение 11 03.07.2009 09:33