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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 15:30   #1
SeMgA
Пользователь
 
Регистрация: 08.06.2010
Сообщений: 22
По умолчанию Сравнение

День добрый
долго искал в интернете тему поиск изображения на мониторе.
ситуация какая - по монитору бегает ключик, нужно поймать его мышкой.
перерыл кучу литературы увы я плох в делфи отсюда примера я не нашел,
зато нарыл некую программу с исходным кодом
[HIDE]
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtDlgs, ExtCtrls;

type
  FRes = record
    found: boolean;
    x,y: integer;
  end;
  
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    ScrollBox2: TScrollBox;
    Image1: TImage;
    Image2: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function CompareIMG: FRes;
  end;
  TBuf = array of array of integer;

var
  Form1: TForm1;
  buf1, buf2: TBuf;

implementation

{$R *.dfm}

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;
  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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
    LoagIMG(buf1, Image1, OpenPictureDialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
    LoagIMG(buf2, Image2, OpenPictureDialog1.FileName);
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;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.Button3Click(Sender: TObject);
var
  FindResult: FRes;
  SearchTime: cardinal;
  Freq, StartCount, EndCount: int64;
  HiResTimer: boolean;
begin
  if (Image1.Width<Image2.Width) or (Image1.Height<Image2.Height) then
    ShowMessage('Ошибка! Img1 меньше Img2')
  else begin
    Screen.Cursor:=crHourGlass;
    HiResTimer:=QueryPerformanceFrequency(Freq);
    if HiResTimer then QueryPerformanceCounter(StartCount) else SearchTime:=GetTickCount;
    FindResult:=CompareIMG;
    if HiResTimer then begin
      QueryPerformanceCounter(EndCount);
      SearchTime:=round((EndCount-StartCount)*1000/Freq);
    end else SearchTime:=GetTickCount-SearchTime;
    Screen.Cursor:=crDefault;
    if FindResult.found then begin
      with Image1.Picture.Bitmap.Canvas do begin
        Pen.Color:=clRed;
        MoveTo(FindResult.x, FindResult.y);
        LineTo(FindResult.x+Image2.Width-1, FindResult.y);
        LineTo(FindResult.x+Image2.Width-1, FindResult.y+Image2.Height-1);
        LineTo(FindResult.x, FindResult.y+Image2.Height-1);
        LineTo(FindResult.x, FindResult.y);
      end;
      ScrollBox1.HorzScrollBar.Position:=FindResult.x;
      ScrollBox1.VertScrollBar.Position:=FindResult.y;
      ShowMessage('Есть совпадение ;-)'+#10#13+'Время поиска: '+IntToStr(SearchTime)+' ms');
    end else ShowMessage('Нет совпвдений!');
  end;
end;

end.
[/HIDE]
данная програмка загружает изображение в себя и сравнивает их
можно ли как - нибудь переделать кнопку чтоб программа искала изображение со 2 иимиджа на єкране
за ранее признателен в помощи!
SeMgA вне форума Ответить с цитированием
Старый 08.05.2012, 15:38   #2
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Если думать в лоб то:
1. Сделать скрин экрана.
2. Пройтись по экрану в поисках "ключика" по маске.

Зависит от того что это за ключик. Хотелось бы увидеть его скрин.
Я например делал бота для игры арканойд. Это там где шарик летает и надо палочкой снизу его отбивать.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 08.05.2012, 15:50   #3
SeMgA
Пользователь
 
Регистрация: 08.06.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Valio Посмотреть сообщение
Если думать в лоб то:
1. Сделать скрин экрана.
2. Пройтись по экрану в поисках "ключика" по маске.

Зависит от того что это за ключик. Хотелось бы увидеть его скрин.
Я например делал бота для игры арканойд. Это там где шарик летает и надо палочкой снизу его отбивать.

что то вроде этого.
как то нужно сделать сравнение экрана чтоб рисунок из image искало на экране размер самого объекта который ищем не больше 20 - 30 на 30 пикселей.
и например если нашелся объект тогда сообщение ура) почему "УРА" уже мозг кипит не получается сделать...
SeMgA вне форума Ответить с цитированием
Старый 08.05.2012, 16:46   #4
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Ну надо просто по пикселям сравнить. В чём проблема то?

Для начало нужно сделать скрин экрана. Затем идти в цикле по пикселям этого скрина и искать совпадение по цвету. Как только нашли начинаем проверять соседнии пиксели, если они совпадают, то мы нашли ключик.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 08.05.2012, 17:29   #5
SeMgA
Пользователь
 
Регистрация: 08.06.2010
Сообщений: 22
По умолчанию

а как это сделать?
я не умею...
SeMgA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение tanyuxxxa Помощь студентам 3 03.03.2012 14:50
сравнение обьектов в С++ dasvex Помощь студентам 1 24.08.2011 19:57
сравнение slavsmo Microsoft Office Excel 2 05.04.2010 17:51
Сравнение текста SoFuWa Microsoft Office Excel 9 19.07.2009 00:38
Сравнение формул Acharia Microsoft Office Excel 13 15.07.2009 17:33