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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2016, 05:13   #1
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Вопрос непонятные явления со ScanLine

не могу понять почему при поиске маленькой картинки в большой с помощью ScanLine, по первому пикселу всегда 100% совпадение, то-есть всегда находит то что нужно, но это касается только первого пикселя, НО при сравнении остальных пикселей найденной картинки с эталоном практически постоянно выдает отрицательный результат.
п.с почему заморочился с сравнением, есть ситуации когда искомая картинка меняется, а поиск этого не замечает...

вот как я делаю поиск и сравнение, застрял на сравнении:
Код:
function TForm1.FndIMG(Name:string; var ClikX,ClikY: Integer): Boolean;
type
  TRGB = record
  b, g, r: byte;
  end;
  ARGB = array[0..2] of TRGB;
  PARGB = ^ARGB;
  PRGB = ^TRGB;
var
  x,y,xx,yy,q,w,range,indikator : integer;
  Stop: Boolean;
  //A,B:TBitmap;   // Bm это картинка в которую скриню окно игры с помощью BitBlt
  Aout,Bout,AAout,BBout {}: PARGB;    // AAout,BBout : PByteArray;
begin
Result:=False; Stop:= False;
range:=0; //SetLength(Aout,byte(A.Height-1));
//B:=TBitmap.Create;  // маленькая (искомая) часть
//A.:=TBitmap.Create;; // большая картинка
A.Picture.Bitmap.Width:=Bm.Width;
A.Picture.Bitmap.Height:=Bm.Height;
Timer1.Enabled:= False;
A.Canvas.CopyRect(Rect(0,0,Bm.Width,Bm.Height),Bm.Canvas,Bm.Canvas.ClipRect);

//img3.Picture.Bitmap:=A;
B.Picture.Bitmap.LoadFromFile(Name);
A.Picture.Bitmap.PixelFormat:=pf24bit;
B.Picture.Bitmap.PixelFormat:=pf24bit;
Bout:=B.Picture.Bitmap.ScanLine[0];
    for y:=0 to A.Height-1 do begin
        Aout:=A.Picture.Bitmap.ScanLine[y];
        for x:=0 to A.Width-1 do begin
          if(Bout[0].r = Aout[x].r) and
            (Bout[0].g = Aout[x].g) and
            (Bout[0].b = Aout[x].b)
          then begin
//          mmo1.Lines.Add('начало перебора');
//          xx:=0; yy:=0; q:=0; w:=x;
//          while q < (x + b.Width-1) do begin
//            if Bout[xx].r = Aout[w].r then mmo1.Lines.Add('да') else mmo1.Lines.Add('нет');
//            if Bout[xx].g = Aout[w].g then mmo1.Lines.Add('да') else mmo1.Lines.Add('нет');
//            if Bout[xx].b = Aout[w].b then mmo1.Lines.Add('да') else mmo1.Lines.Add('нет');
//          Inc(xx); Inc(w); Inc(q);
//          end;
//          mmo1.Lines.Add('Конец перебора');
//          Exit;

            for yy := 0 to B.Height-1 do begin
              AAout:=A.Picture.Bitmap.ScanLine[y+yy];
              BBout:=B.Picture.Bitmap.ScanLine[yy];
              for xx := 0 to B.Width-1 do begin
//              mmo1.Lines.Add('RGB- '+IntToStr(BBout[xx].r)+'/'+IntToStr(BBout[xx].g)+'/'+IntToStr(BBout[xx].b)+
//              ' -/- RGB- '+IntToStr(AAout[x+xx].r)+'/'+IntToStr(AAout[x+xx].g)+'/'+IntToStr(AAout[x+xx].b));
//                  Application.ProcessMessages;
                if(BBout[xx].r = AAout[x+xx].r) and
                  (BBout[xx].g = AAout[x+xx].g) and
                  (BBout[xx].b = AAout[x+xx].b)
                then begin

                end else begin
                  Inc(indikator);
                  mmo1.Lines.Add('ошибка '+ indikator.ToString);
                end;
                //If Stop then begin Break; end;
                  if yy = B.Height-1
                  then begin
      //            Timer1.Enabled:= False;
      //            img1.Canvas.Ellipse(x,y,x+B.Width,y+B.Height);
                  ClikX:=x+(B.Width div 2);
                  ClikY:=y+(B.Height div 2);
                  mmo1.Lines.Add('НАЙДЕНА - '+Name+' - '+ IntToStr(xx)+' - '+ IntToStr(yy)+' / '+ IntToStr(x)+' - '+ IntToStr(y));
                  FreeAndNil(A);
                  FreeAndNil(B);
                  Result:=True; Timer1.Enabled:= True;
                  Exit;
                  end;
              end;
              //If Stop then begin Break; Stop := False; end;
            end;
          end;
        end;
    end;
if B <> nil then begin FreeAndNil(A); end;
if B <> nil then begin FreeAndNil(B); end;
mmo1.Lines.Add('НЕ НАЙДЕНА'+'-'+Name); Timer1.Enabled:= True;
end;
Михаил22042016 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ScanLine, градация серого. Winexcel Общие вопросы Delphi 6 17.12.2013 15:41
ScanLine ijonhson C++ Builder 1 28.03.2013 06:31
Скрип земли, необъяснимое явления. bitix Свободное общение 13 18.10.2012 22:12
Работа со ScanLine ofx C++ Builder 1 22.08.2012 20:36
ReadProcessMemory/Не понятные явления coNsept Общие вопросы C/C++ 2 31.07.2011 19:33