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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2016, 17:15   #1
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию поиск маленькой картинки в большой. Помогите допилить))))

есть функция, для поиска маленькой картинки в большой. Эта функция находит пару верхних левых пикселей (самых первых пикселей) в маленькой картинки, в большой, дальше я пытался копировать rect соответствующего размера (равного эталону) в отдельную битмапу и сравнивать с эталоном. испытывал два способа, оба провалились, неделю мучился искал свою ошибку, ну уже нервов не хватает.
может кто-то делал, подскажите или покажите как лучше или правильно

Код:
function TForm1.FndIMG(Name:string; var ClikX,ClikY: Integer): Boolean;
type
  TRGB = record
  b, g, r: byte;
  end;
  ARGB = array[0..5] of TRGB;
  PARGB = ^ARGB;
var
  x,y,xx,yy : integer;
  A,B:TBitmap;          // А - большая картинка в которой ищу картинку - В 
  Arow,Brow: PARGB;    
begin
Result:=False; Wait(100);
B:=TBitmap.Create;  // маленькая (искомая) часть
B.LoadFromFile(Name);
A:=img1.Picture.Bitmap;    // img1 постоянно обновляется по таймеру получая картинку из функции BitBlt
A.PixelFormat:=pf24bit;
B.PixelFormat:=pf24bit;
Brow:= B.ScanLine[0];
  for y:=0 to A.Height-1 do begin
    Arow:=A.ScanLine[y];
    for x:=0 to A.Width-1 do begin
      if(Brow[0].r = Arow[x  ].r) and
        (Brow[0].g = Arow[x  ].g) and
        (Brow[0].b = Arow[x  ].b) and
        (Brow[1].r = Arow[x+1].r) and
        (Brow[1].g = Arow[x+1].g) and
        (Brow[1].b = Arow[x+1].b)
      then begin
        ClikX:=x+(B.Width div 2);
        ClikY:=y+(B.Height div 2);
        mmo1.Lines.Add('НАЙДЕНА'+'-'+Name+'-'+ IntToStr(x)+'-'+ IntToStr(y));
        FreeAndNil(B);
        Result:=True;
        Exit
      end;
    end;
  end;
if B <> nil then begin FreeAndNil(B); end;
mmo1.Lines.Add('НЕ НАЙДЕНА'+'-'+Name);
end;
Михаил22042016 вне форума Ответить с цитированием
Старый 11.05.2016, 01:50   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

А что за картинки участвуют в поиске?
Два левых верхних пикселей мало что значат.
northener вне форума Ответить с цитированием
Старый 11.05.2016, 07:16   #3
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
А что за картинки участвуют в поиске?
Два левых верхних пикселей мало что значат.
картинка из игры большая, в ней ищется картинка кнопки или объекта, есть объекты которые меняются, например яркость увеличивается а потом уменьшается, ну или другими словами на картинку наложен спец эффект(сияние), поиск по первым пикселям имеет свои плюсы, но в некоторых случаях нужно полностью проверить соответствие картинки.
Помню, где-то читал мнение человека, можно проверить картинку по диагонали, чтобы полностью не проверять.
Михаил22042016 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хочу что бы логин и с большой, и с маленькой буквы работал Александр9797 Общие вопросы Delphi 11 22.04.2016 05:17
Поиск картинки в картинке Alloc Мультимедиа в Delphi 9 21.04.2016 19:44
Помогите допилить скрипт SergeySS PHP 2 06.08.2014 16:17
Поиск картинки в картинке Alexandr555 Общие вопросы Delphi 2 04.03.2013 15:49
Помогите с написанием маленькой проги Nightprince Помощь студентам 6 16.01.2009 00:08