![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Программа "бот косынка" делает скриншот экрана, затем ищет в нем образец. 
		
	
		
		
		
		
		
		
			Находит на отлично, но бывает подводит... причина: в цветовых каналах, на глаз человека абсолютно одинаковые изображения. Как то возможно сделать одинаковыми изображения и для программы??? (пытался играть с тоном, но увы...)           ![]() Код: 
	 //код поиска скачен с иходников
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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 1. Переводить изображение в ч/б, причем тут надо поиграться с уровнем, т.е. сколько %% должно быть, что бы точка стала черной. Я бы сказал, что можно с помощью любой библиотеки сделать 256 оттенков серого, а потом в ч/б (1 бит на точку) переводить самому. 
		
	
		
		
		
		
		
	
		
		
	
	
	2. Нечеткое сравнение. По контурам находишь образец, сравниваешь, потом, соответсвенно, принимаешь решение по кол-ву ошибок сравнения. Т.е. изображение может совпадать не полностью, а только процентов на 80. Уже достаточно точно. Потом просто "играешься" с БД картинок и выверяешь коэф.  | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
ryzveld (05.11.2013)
  | ||
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 1. У Вас случайно что нибудь подобное не имеется? Бессонные ночи в пытках не дают результата... Вожусь с вариантов нечеткое сравнение, но процент совпадания всегда разный. Начинаю считать\искать совпадение с [0,0] пксля фрагмента... 2. А можно пссчитать процент совпдения чз код предоставленный в исходниках? (код поиска в первом сообщении)  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
  | 
| Этот пользователь сказал Спасибо x128 за это полезное сообщение: | ||
 
ryzveld (08.11.2013)
  | ||