Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.11.2013, 05:44
ryzveld ryzveld вне форума
Прохожий
 
Регистрация: 27.10.2013
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
Сообщение Поиск изображения (цветовые каналы)

Программа "бот косынка" делает скриншот экрана, затем ищет в нем образец.
Находит на отлично, но бывает подводит... причина: в цветовых каналах, на глаз человека абсолютно одинаковые изображения.

Как то возможно сделать одинаковыми изображения и для программы??? (пытался играть с тоном, но увы...)



Код:
 //код поиска скачен с иходников
var
  buf1, buf2: TBuf;

procedure LoagIMG(var buffer: TBuf; img: TImage; Name: String);
var
  x,y,c: integer;
  p: pByteArray;
begin
  img.Picture.LoadFromFile(Name);
  img.Picture.Bitmap.PixelFormat:=pf24bit; // pf8Bit;
  x:=0; y:=0; x:=0;
  SetLength(buffer, img.Height, img.Width);
  for y:=0 to img.Height-1 do begin
    p:=img.Picture.Bitmap.ScanLine[y];
    for x:=0 to img.Width-1 do begin
      c:=((p[x*3+0] shl 8+p[x*3+1]) shl 8)+p[x*3+2];
      buffer[y,x]:=c;
    end;
  end;
end;

function TForm1.CompareIMG: FRes;
var
  y, x, yy, xx: integer;
begin
  y:=0;
  repeat
    x:=0;
    repeat
      Result.found:=true;
      yy:=0;
      repeat
        xx:=0;
        repeat
          if buf1[y+yy, x+xx]<>buf2[yy,xx] then Result.found:=false;
          inc(xx);
        until (xx>=Image2.Width) or (Not Result.found);
        inc(yy);
      until (yy>=Image2.Height) or (Not Result.found);
      inc(x);
    until (x>Image1.Width-Image2.Width) or (Result.found);
    inc(y);
  until (y>Image1.Height-Image2.Height) or (Result.found);
  if Result.found then begin
    Result.x:=x-1;
    Result.y:=y-1;
  end;
end;

// Пример использования:
type
  FRes = record
    found: boolean;
    x,y: integer;
  end;

var
  FindResult: FRes;

begin
    LoagIMG(buf1,Image1 ,'C:\Bot\Screen.bmp');
    LoagIMG(buf2, Image2, 'C:\Bot\AB.bmp');
    FindResult:=CompareIMG;
    if FindResult.found then ShowMessage('Нашел');
end;

Последний раз редактировалось ryzveld, 05.11.2013 в 06:14.
Ответить с цитированием
  #2  
Старый 05.11.2013, 06:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Переводить изображение в ч/б, причем тут надо поиграться с уровнем, т.е. сколько %% должно быть, что бы точка стала черной. Я бы сказал, что можно с помощью любой библиотеки сделать 256 оттенков серого, а потом в ч/б (1 бит на точку) переводить самому.
2. Нечеткое сравнение. По контурам находишь образец, сравниваешь, потом, соответсвенно, принимаешь решение по кол-ву ошибок сравнения. Т.е. изображение может совпадать не полностью, а только процентов на 80. Уже достаточно точно. Потом просто "играешься" с БД картинок и выверяешь коэф.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
ryzveld (05.11.2013)
  #3  
Старый 07.11.2013, 06:47
ryzveld ryzveld вне форума
Прохожий
 
Регистрация: 27.10.2013
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
1. Переводить изображение в ч/б, причем тут надо поиграться с уровнем, т.е. сколько %% должно быть, что бы точка стала черной. Я бы сказал, что можно с помощью любой библиотеки сделать 256 оттенков серого, а потом в ч/б (1 бит на точку) переводить самому.
2. Нечеткое сравнение. По контурам находишь образец, сравниваешь, потом, соответсвенно, принимаешь решение по кол-ву ошибок сравнения. Т.е. изображение может совпадать не полностью, а только процентов на 80. Уже достаточно точно. Потом просто "играешься" с БД картинок и выверяешь коэф.

1. У Вас случайно что нибудь подобное не имеется? Бессонные ночи в пытках не дают результата...
Вожусь с вариантов нечеткое сравнение, но процент совпадания всегда разный. Начинаю считать\искать совпадение с [0,0] пксля фрагмента...
2. А можно пссчитать процент совпдения чз код предоставленный в исходниках? (код поиска в первом сообщении)
Ответить с цитированием
  #4  
Старый 07.11.2013, 11:44
x128 x128 вне форума
Новичок
 
Регистрация: 03.02.2010
Сообщения: 64
Репутация: 133
По умолчанию

Цитата:
Сообщение от ryzveld
...но процент совпадания всегда разный
Нужно задавать порог т.е. максимальную ошибку и искать область с минимальным отличием. Посмотри FindImg.zip, это тот же код, который ты нашел, только с поправкой на ветер.
Ответить с цитированием
Этот пользователь сказал Спасибо x128 за это полезное сообщение:
ryzveld (08.11.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter