Поиск изображения(Delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Rastamanka, 9 Jun 2011.

  1. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    В общем есть задача.
    Создать программу которая
    1) В браузере выделяем нужное изображение к примеру 5х5. Изображение анимированное. То есть делаем скрин и на нем выделяем эту область.
    2) Далее необходимо это изображение постоянно искать в определенной области браузера(то есть не по всему экрану а к примеру в области 400х300 указанной мной) при этом как было сказано выше изображение анимированное то есть чтобы его найти наверно надо будет поставить таймер чтобы искал каждую секунду.
    3) При нахождении такого изображения кликать на нем или есть условие то кликать к примеру на 5 пикселей ниже его.

    Подскажите как реализовать. А конкретнее интересует как реализовать поиск изображения? То есть надо не сравнивать 2 изображения а в браузере найти нужное мне.
    Пример чего хочу можно посмотреть в программе AutoClickExtreme но хочется свое т.к. там много лишнего что мне вообще не нужно.
     
    #1 Rastamanka, 9 Jun 2011
    Last edited: 9 Jun 2011
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Я бы делал не так:
    1) Делаем все кадры анимации нужного нам изображения
    2) Делаем скрин экрана
    3) Из скрина экрана берем область 5х5 и сравниваем с
    1-м кадром
    2-м кадром
    .....
    а чтобы было оптимальнее:
    берем из скрина область 5х1 и сравниваем с аналогичными областями кадров, если какая-то совпадает, то берем область 5х1, расположеную ниже и сравниваем с соотв. областями кадров....
    Но тут наверное прийдется перед стартом создвать таблицу соответсвий кадров. Например:
    1 линия у 1 и 3 кадра одинаковые
    2 линия у 1,2 и 3 одинаковые
    и т.д.
    В итоге если соответстиве нашли в 1-х 5х1, то нужно вторые 5х1 проверить у 1 и 3 кадра.

    Я когда-то писал сходную прогу, но она очень долго 1 экран пробегала, поэтому если будешь писать:
    выбери и хорошо продумай алгоритм перебора иначе смысла от нее не будет.
     
    #2 xophet, 9 Jun 2011
    Last edited: 9 Jun 2011
  3. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Нашла пример тут http://programmersforum.ru/showpost.php?p=191914&postcount=3
    Работает очень даже быстро ))
     
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    p.s. там как раз перебор по строкам :)
     
  5. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Не подскажите как узнать координаты найденного изображения? Желательно центр его.
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Функция возвращает True, если изображение найдено, а в переменную
    R := Rect(x, y, x+bmSub.Width, y+bmSub.Height);
    пишет координаты найденного изображения
    Если вам нужен именно центр, то
    x+(bmSub.Width div 2)
    y+(bmSub.Height div 2)
     
  7. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    В общем все супер. Осталось вот какую проблему решить.
    Вместо
    Code:
        // Худший вариант    
     bmSub  := CaptureScreenRect(Rect(Screen.Width-150,Screen.Height-150,Screen.Width,Screen.Height));
    Сделала
    Code:
    bmSub.LoadFromFile('screen.bmp');
    Все чудно работает сколько раз подряд не жмакаю на баттон.
    Но потом понадобилось чтобы картинка бралась из Timage.
    Передаю так
    Code:
    bmSub:=Form1.imggv1.Picture.Bitmap
    И тут появилась проблема первый поиск проходит на ура. Но когда жму второй раз на баттон вылетает ошибка а именно
    Code:
    raised exception class eaccessviolation with message 'access violation at address
    В чем ошибка?