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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2015, 22:23   #1
Alloc
Пользователь
 
Регистрация: 12.10.2015
Сообщений: 11
По умолчанию Поиск картинки в картинке

Привет здешним обитателям!

Многоуважаемые фурумчане, спецы, будьте добры, помогите разобраться мне с программой. Подскажите пожалуйста, как логичней и быстрей (имею в виду скорость выполнения кода) сделать следующее:

Есть игра. Пытаюсь сделать для нее некое подобие бота. Выглядит она следующим образом:




каждые 1.5-2.0 секунды, на экране появляются стрелочки которые необходимо нажать. Появляются по нарастающей, сначала одна (нажимаем), потом сразу две, потом сразу три и т.д.

Какой алгоритм лучше всего подойдет в данной ситуации?

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

Слышал про способ распознавания картинок. как вы думаете, он уместен в данном случае? Или существует еще более логичный вариант? Как бы вы сделали?

Так как я только в начале пути познания среды Delphi да и вообще в программировании, на всякий случай на будущее, прошу понять и простить за нубство.

Буду вам очень признателен за идеи

Последний раз редактировалось Alloc; 13.10.2015 в 00:00.
Alloc вне форума Ответить с цитированием
Старый 12.10.2015, 23:23   #2
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Зависит от того какие и сколько бывают вариаций. Судя по картинке - скорее всего вам надо нечёткое забылназвание совпадение или сравнение по маске.
Цвет и форма стрелок? Надо ещё примеров. Если чего - можно в личку или на почту: resourcespace@mail.ru
ResourceSpace вне форума Ответить с цитированием
Старый 13.10.2015, 00:03   #3
Alloc
Пользователь
 
Регистрация: 12.10.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Цвет и форма стрелок? Надо ещё примеров. Если чего - можно в личку или на почту: resourcespace@mail.ru
Спасибо за ответ. Добавил в шапку дополнительный скриншот
Alloc вне форума Ответить с цитированием
Старый 13.10.2015, 09:50   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Зависит от того какие и сколько бывают вариаций. Судя по картинке - скорее всего вам надо нечёткое забылназвание совпадение или сравнение по маске.
Цвет и форма стрелок? Надо ещё примеров. Если чего - можно в личку или на почту: resourcespace@mail.ru
Насмешил. "стрелочки" не появляются сам-собой. А как к ним доступиться, я скажу только за денюжку. Голодный я. А на голодный желудок, плохо думается
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 13.10.2015, 22:25   #5
Alloc
Пользователь
 
Регистрация: 12.10.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Насмешил. "стрелочки" не появляются сам-собой. А как к ним доступиться, я скажу только за денюжку. Голодный я. А на голодный желудок, плохо думается
если бы мне были нужны твои услуги я бы написал в соответствующий раздел
Alloc вне форума Ответить с цитированием
Старый 14.10.2015, 11:20   #6
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Похожая тема, посмотри решение, может подойдет.
x128 вне форума Ответить с цитированием
Старый 15.10.2015, 02:15   #7
Alloc
Пользователь
 
Регистрация: 12.10.2015
Сообщений: 11
По умолчанию

Спасибо за ответы. x128, отдельное спасибо за ссылку, но я решил немного по другому сделать. Тупо пиксели сравнивать, так проще как мне кажется и быстрее... но пример пригодиться.

Если позволите, еще один вопрос. Я вот думаю проще было бы для начала определить, сколько этих стрелок в данный момент. Думаю сделать снимок небольшого участка где собственно и появляются стрелки, и пробежать for Х=0 to bmp.width-1 do... и в этом цикле как то определить где цвет стрелки и цвет фона (примерный).. если на пути цвет стрелки тогда записываем в переменную Count:=1, цвет фона идем дальше.. ну вот как то так.. проблема в том, что я в силу своей неопытности в программирование никак не соображу как это сделать.. я уверен для вас это не составит труда. Будьте добры, покажите пожалуйста на примере как это реализовать, буду вам очень блпгодарен

Пытаюсь реализовать задуманное... Поправьте пожалуйста меня если не сложно, идея такая, если во время сканирования мы наткнулись на определенный цвет - перепрыгиваем на 15 пикселей дальше и продолжаем и дальше в том же духе. Я пытался изобразить нечто подобное, но не вышло. Будьте добры, помогите. Заранее спасибо.

Код:
var
 delta: Variant;
begin
delta:= 160;
dstPixel := Bmp1.ScanLine[Y];
for X := 0 to Width - 1 do
begin
 with dstPixel^ do
 begin
 rgbRed := dstPixel^.rgbRed;
 rgbGreen := dstPixel^.rgbGreen;
 rgbBlue := dstPixel^.rgbBlue;
 Inc(srcPixel);
 end;
 if Abs(GetRValue(dstPixel^.rgbRed) - 160) < delta and
 Abs(GetGValue(dstPixel^.rgbGreen) - 170) < delta and
 Abs(GetBValue(dstPixel^.rgbBlue) - 170) < delta then
 x:=x+15; // Тут выдает ошибку "Assignment to FOR-Loop variable 'X'"

 Inc(dstPixel);
end;
end;

Последний раз редактировалось Stilet; 20.10.2015 в 08:57.
Alloc вне форума Ответить с цитированием
Старый 18.10.2015, 21:32   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
// Тут выдает ошибку "Assignment to FOR-Loop variable 'X'"
Ну и говорит, что нельзя переменную цикла for в теле цикла изменять. Он сам позаботится об этом. А если нужно используй другой вид цикла - while или repeat
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.10.2015, 21:58   #9
Alloc
Пользователь
 
Регистрация: 12.10.2015
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну и говорит, что нельзя переменную цикла for в теле цикла изменять. Он сам позаботится об этом. А если нужно используй другой вид цикла - while или repeat
спасибо)

Вместо
Код:
for X := 0 to Width - 1 do
поставил
Код:
while X < bmp.Width - 1 do
. Только сейчас почему то выводится не количество пикселей совпавших по цвету а ширина изображения... т.е. 346.

Код:
var
  x, y: Integer;
  dstPixel, srcPixel: PRGBQuad;
  delta: Variant;
begin
  delta:= 100;
  bmp := TBitmap.Create;
  bmp.PixelFormat := pf32bit;
  bmp.Width := 346; bmp.Height := 40;
  bmp.LoadFromFile('2.bmp');

  try
    //BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, dc, Point.X, Point.Y, SRCCOPY);

    dstPixel := Bmp.ScanLine[8];
    X:=0;
    while X < bmp.Width - 1 do
    begin
      with dstPixel^ do
      begin
        rgbRed := dstPixel^.rgbRed;
        rgbGreen := dstPixel^.rgbGreen;
        rgbBlue := dstPixel^.rgbBlue;
      end;
      {if Abs(GetRValue(dstPixel^.rgbRed) - 160) < delta and
         Abs(GetGValue(dstPixel^.rgbGreen) - 230) < delta and
         Abs(GetBValue(dstPixel^.rgbBlue) - 200) < delta then}
       if (GetRValue(dstPixel^.rgbRed) > 160) and
          (GetGValue(dstpixel^.rgbGreen) < 260) and
          (GetBValue(dstpixel^.rgbBlue) < 200) then
           x:=x+15;

      Inc(dstPixel);
    end;
  finally
    Form1.Caption:= IntToStr(x);
    bmp.Free;
    ReleaseDC(h1, dc);
  end;
Будьте добры поправьте мой код если не трудно, буду вам очень благодарен за помощь.
Alloc вне форума Ответить с цитированием
Старый 21.04.2016, 19:44   #10
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Хорошо мгновенно находит и выделяет искомое изображение

Вдруг кому все еще нужно
мгновенно находит и выделяет искомое изображение
Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
  Timag = record
    Flag_: boolean;
    BitMap: TBitmap;
    X,Y,Color: integer;
    Bufarr: array of array of Integer;
  end;
type
  TForm1 = class(TForm)
    btn1: TButton;
    img1: TImage;
    lbl1: TLabel;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure img1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    function FndIMG(Name:string):integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
implementation
 
{$R *.dfm}
 
procedure TForm1.btn1Click(Sender: TObject);
begin
FndIMG('123.bmp');
FndIMG('234.bmp');
FndIMG('345.bmp');
FndIMG('123.bmp');
FndIMG('Bm2.bmp');
end;
 
 
function TForm1.FndIMG(Name:string): integer;
var
 x,y,c : integer;  A,D:Timag;
 P,PP : PByteArray;
begin
c:=0;
D.BitMap:=TBitmap.Create;
A.BitMap:=img1.Picture.Bitmap;
D.BitMap.LoadFromFile(Name);
A.BitMap.PixelFormat:=pf24bit;
D.BitMap.PixelFormat:=pf24bit;
PP:=D.BitMap.ScanLine[0];
    for y:=0 to A.BitMap.Height-1 do begin
        P:=A.BitMap.ScanLine[y];
        for x:=0 to A.BitMap.Width-1 do begin
 
            if(P[x*3+0]=PP[0]) and
            (P[x*3+1]=PP[0+1]) and
            (P[x*3+2]=PP[0+2]) and
            (P[x*3+3]=PP[0+3]) and
            (P[x*3+4]=PP[0+4]) then begin
            img1.Canvas.Ellipse(x,y,x+D.BitMap.Width,y+D.BitMap.Height);
            FreeAndNil(D.BitMap);
            Exit
            end;
        end;
    end;
if D.BitMap <> nil then FreeAndNil(D.BitMap);
end;
 
procedure TForm1.img1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
btn1.Caption:=IntToStr(x)+' '+IntToStr(y);
end;
 
end.

Последний раз редактировалось Михаил22042016; 21.04.2016 в 19:46.
Михаил22042016 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Положение картинки на картинке Санеккк HTML и CSS 1 27.03.2015 09:07
Поиск картинки в картинке Alexandr555 Общие вопросы Delphi 2 04.03.2013 15:49
Поиск фрагмента изображения на картинке banderas.antonio C# (си шарп) 3 07.05.2011 18:45
Отображение картинки на кнопке WPF. Загрузка картинки из ресурсов. Проблема с Uri. Casper-SC Общие вопросы .NET 0 27.06.2010 23:11
Поиск объекта на картинке Terran Общие вопросы Delphi 3 21.05.2010 16:35