Findimage

Материал из UoPilot
Версия от 10:34, 28 августа 2019; Tatikoma (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Описание

FindImage - оператор поиска сохраненного изображения в области заданной начальными и конечными координатами по оси XY.

Формат картинки должен быть: bmp 24 бита.
Цвет крайнего пикселя в левом верхнем углу изображения считается "цветом фона", и при поиске картинки на экране не учитывается. Например, цвет этого пикселя красный (255). В этом случае все пиксели красного цвета присутствующие на искомой картинке будут считаться фоновыми (прозрачными) и не будут сравниваться с тем, что присутствует на экране. Поэтому, нельзя чтобы в файле-картинке все пиксели были одного цвета. Нужно сделать, чтобы хотя бы один левый верхний пиксель цветом отличался от остальных.

Синтаксис

Привязка к окну: опционально.
Работа со свернутым окном: нет.
Работа с перекрытым окном: Да. Привязка к окну обязательна. Aero (темы Windows) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.

set #a FindImage (#StartX #StartY #EndX #EndY ($filename) %ResultArray [#type [#accuracy [#count [#deviation]]]] [abs])

Где:
<#a> - переменная, в которую записывается результат работы команды findimage:
Если #a = 0, значит поиск был произведён, но картинка не найдена.
Если найдена только 1 картинка, то будет записан процент точности найденного изображения.
Если найдено несколько картинок, то будет записано количество найденных изображений.
Однозначно определить сколько именно картинок было найдено командой FindImage лучше всего по размеру массива %ResultArray с помощью функции Size(%ResultArray).
#a < 0 означает, что FindImage не смог произвести поиск- либо была обнаружена ошибка в написании параметров команды, либо проблемы с самим файлом картинки.
Если #a = -4, значит файл картинки не найден / в неправильном формате / повреждён / все пиксели файла одного цвета. Чаще всего- путь к файлу указан неправильно.
<#StartX #StartY> - координаты левого верхнего угла области поиска.
<#EndX #EndY> - координаты правого нижнего угла области поиска.
<($filename)> - путь к сохранённому изображению (только файл формата bmp). Путь к изображению может быть указан как абсолютный - (C:\programms\pilot\images\), так и относительный - (images\). Указывается в круглых скобках. При использовании пробелов в адресе используйте кавычки либо строковую переменную(например $myPatch), предварительно присвоив ей(переменной) необходимый адрес.
<%ResultArray> - результирующий массив, в который записываются координаты изображения. Координатами изображения считается пиксель левого верхнего угла изображения. Если найдено несколько изображений, то координаты всех найденных изображений. Каждая строка массива хранится данные по отдельному найденному изображению: в первой колонке- координата X, во второй колонке- координата Y.
[#type] - тип поиска. Может принимать значения: 1 (надежный), 2 (быстрый). Настоятельно рекомендуется использовать быстрый способ поиска, кроме случаев с некорректным обнаружением изображения. По умолчанию 2й тип поиска.
[#accuracy] - точность поиска. Указывается в процентах. Используется для отсева изображений не достаточно схожих с оригиналом. По умолчанию значение равно 80%.
[#count] - ограничение количества найденных изображений. По умолчанию установлено для одного изображения - значение 1, для всех возможных - значение -1.
[#deviation] - Погрешность оттенка. Пример: есть погрешность 3%. точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.
[abs] - флаг использования абсолютных координат. Если он указан то поиск происходит относительно левого верхнего угла экрана. Без флага поиск происходит относительно левого верхнего угла рабочего окна(привязанного через ctrl+a либо иным способом).

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

Коды ошибок FindImage:
'-1' упало при поиске, точная причина не известна.
'-2' не нашли открывающую скобку после имени функции.
'-3' не найдено пути в скобках.
'-4' ошибка поиска файла.
'-5' ошибка обработки искомого изображения.
'-6' ошибка получения изображения с экрана.
'-7' нечего искать, искомая картинка пустая.

Иногда требуется сделать клик не по самому изображению, а со смещением. Указывать можно как вначале скрипта так и перед функцией Findimage.

set findoffsetx 50    //смещение вправо на 50 пикселей
set findoffsety 30    //смещение вниз на 30 пикселей

set findoffsetx -40   //смещение влево на 40 пикселей
set findoffsety -60   //смещение вверх на 60 пикселей

Примеры

// Пример 1
// перед запуском скрипта не забываем привязать скрипт к рабочему окну (Ctrl+A)
set #startX 100
set #startY 120
set #endX 300
set #endY 540
set $path "C:\Program Files\UOPilot\images\"
set %cash[1] картинка
// будем искать картинку из файла C:\Program Files\UOPilot\images\картинка.bmp
set #a findimage (#startX #startY #endX #endY ($path%cash[1].bmp) %crds 2)
if #a > 0
  msg Изображение найдено в координатах X= %crds[1 1] Y= %crds[1 2]. Кликнем на нём...
  left %crds[1 1] %crds[1 2] // кликнули
else
  msg Изображение не найдено
end_if

В результате работы, если в заданной области картинка обнаружена, в массив %crds[1 1] будет записано значение координаты X для первой картинки, а в %crds[2 2] - значение Y для второй картинки.

// Пример 2
//поиск изображений (если будет найдено больше 20 поиск прекратится) с точностью 70% и отклонением в цвете 5%
set #check FindImage (#startX #startY #endX #endY (images\step.bmp) %crds 2 70 20 5)   
// Пример 3
set #b FindImage (10 100 30 150 (d:\myImages\wolf.bmp) %arr 2 80 20 5)
// Пример 4
// будем искать картинку из файла картинка2.bmp, находящуюся в папке пилота
set #a findimage (100 120 1024 700 (\картинка2.bmp) %arr 2 80 -1)  
set #w size (%arr) // получим число найденных картинок
msg Найдено картинок: #w
for #i 1 #w
   set #x %arr [#i 1]
   set #y %arr [#i 2]
   msg картинка в координатах: #x #y
end_for
// Пример 5
// поиск нескольких картинок
// перед запуском скрипта не забываем привязать скрипт к рабочему окну (Ctrl+A)
set #startX 0
set #startY 0
set #endX 1920
set #endY 1080
set $path "C:\Program Files\UOPilot\images\"      // путь к картинкам
set %image [1] картинка1                          // имя изображения
set %image [2] картинка2                          // имя второго изображения
set %image [3] картинка3                          // третьего
set %image [4] карти                              // имена могут быть любыми

set #size size(%image)                            // всего картинок 
hint Всего картинок #size 

:metka
for #i 1 #size 1                     // цикл для поиска картинок
    set #a findimage (#startX #startY #endX #endY ($path%image[#i].bmp) %arr 2)
    if  #a > 0
        move %arr[1 1] %arr[1 2]     // переместить курсор на найденную картинку
        wait 500                     // ждать 0,5 секунды
    end_if
end_for
wait 3000                            // ждать 3 секунды
goto metka


Примеры поиска картинки в перекрытом(не свёрнутом) окне:
Привязка к окну обязательна. Aero (темы Windows 7) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.
Окно может быть перекрыто полностью, частично или вообще не перекрыто. Может находиться за пределами экрана.
Иногда требуется указывать родительское окно. В окне пилота есть кнопка 'F', при нажатии открывается окно, в котором отображается что "видит" пилот при поиске (Findcolor, Findimage). Если в окне "чёрный квадрат", значит указано не то окно. В Windows 10 работает не во всех приложениях, может потребоваться установка Aero Glass.

// Пример 6
//Чтобы понять как работает поиск можно попробовать на рабочем столе найти значок 'Мой компьютер'.
//Делаем картинку значка в формате bmp, называем 'мойкомпьютер' (без кавычек), закидываем на диск 'C:'.
//При этом можно перекрыть значок каким-нибудь окном.

//Не забываем сделать привязку Ctrl + A.
set #a FindImage(0 0 1920 1080 (C:\мойкомпьютер.bmp) %arr workwindow)
if #a > 0
    log Картинка найдена. Наведём на неё курсор.
    move %arr [1 1] %arr [1 2]
    End_script
else
    msg Картинка не найдена.
end_if 
// Пример 7
//Ищем картинку в окне Yandex, при этом не важно какое указано окно через Ctrl + A или сделано рабочим через 'set workwindow'. 
set #handle FindWindow(Yandex)              //поиск окна с именем Yandex
set #a FindImage(0 0 1920 1080 (C:\UOPilot\images\image.bmp) %arr #handle 80 -1 3)     //поиск изображения
hint #a                                     //в правом нижнем углу отображён результат поиска     
if #a > 0
    move %arr [1 1] %arr [1 2] #handle      //навести курсор на первую найденную картинку 
                                            //обратите внимание, что в команде 'move' указан хендл окна
                                            //т. е. курсор будет перемещён как будто привязка сделана к окну Yandex
    End_script
end_if

Смотрите также

Findcolor
If
Get color

История развития

2.20
Добавил команду поиска изображений 'set $a FindImage (StartX StartY EndX EndY (filename) ResultArray [type [accuracy [count]]] [abs])'. Ищет по уникальному для изображения цвету. может ничего не найти, если этот цвет чем-то перекрыт. цвет в левом верхнем углу изображения считается цветом фона, и не анализируется. изображение должно быть 24 бита, bmp. В 'ResultArray' возвращает координаты левого верхнего угла найденых изображений. в строковой переменной возвращает количество найденых изображений, либо процент точности единственного найденного.
type:
1 - надежный (default)
2 - быстрый
accuracy: точность поиска в процентах (default: 80)
count: максимальное количество найденых изображений (default: 1, all: -1)
Коды ошибок:
'-1' упало при поиске, точная причина не известна
'-2' не нашли открывающую скобку после имени функции
'-3' не найдено пути в скобках
'-4' ошибка поиска файла
'-5' ошибка обработки искомого изображения
'-6' ошибка получения изображения с экрана

2.21.2
Исправил ошибку с определением пути к файлу картинки в 'findimage' после сохранении скрипта через пункт меню 'сохранить как'

2.23
Добавил в 'findimage' погрешность оттенка. указывается в %. слегка изменился синтаксис команды:

'set $a FindImage (StartX StartY EndX EndY (filename) ResultArray [type [accuracy [count [deviation]]]] [abs])'

Пример: есть погрешность 3%. точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.
Переделал 'findimage'. повысил стабильность работы. ускорил в ~27 раз при типе поиска 2
Исправил вычисление точности найденной картинки в команде 'findimage'

2.27
Научил 'findimage' искать картинки в перекрытых окнах. ищет не на всем экране, а в конкретном указанном окне. хэндл окна указывается в качестве типа поиска

set #w findwindow (test.bmp)
set $a FindImage ( 0 0 1300 1300 (2.bmp) %a workwindow 70 10 15)
set $a FindImage ( 0 0 1300 1300 (2.bmp) %a #w 70 10 15)

2.27.1
Добавил код ошибки -4 с выводом сообщения, что файл не найден в команде 'findimage'.
Подправил поиск в перекрытых окнах в командах 'findimage', 'findcolor'.

2.31
Научил 'findimage' понимать координаты, указанные элементами массива.

2.32
Добавил в 'findimage' возврат конечных координат найденной картинки в третьем и четвертом элементе возвращаемого массива.

2.33
Исправил ошибку в 'findimage', когда выводил имя массива вместо количества найденных.
Переписал команду 'findimage'. Исправил утечки памяти.

2.34
Исправил 'findimage' и 'findcolor'. Возвращали неправильные координаты по Y. Ищет слева снизу - вправо вверх.

2.35
Перевернул 'findimage'. Теперь снова ищет сверху вниз.
Исправил в команде 'findimage' выходом за пределы диапазона поиска в сторону уменьшения.
Добавил в 'findimage' возврат конечных координат найденной картинки в третьем и четвертом элементе возвращаемого массива при типе поиска 2.
Исправил в 'findimage' возврат конечных координат найденной картинки (не возвращало совсем).
Исправил 'findimage' и 'findcolor'. Возвращали неправильные координаты.
Сделал по-умолчанию второй тип поиска в команде 'findimage'.

2.36
Добавил переменные смещения кликов мышью и команды 'move', и переменные смещения возвращаемых координат команд 'findimage' и 'findcolor': 'clickoffsetx', 'clickoffsety', 'findoffsetx', 'findoffsety'.

  //размер картинки 9х9
set findoffsetx 5 
set findoffsety 5
set ... findimage
  //вернет координаты не левого верхнего угла а центра картинки
set clickoffsetx 5
set clickoffsety 5
left 0 0
  //кликнет в координаты 5, 5

Добавил кнопочку "F", открывающую тестовую формочку с изображением, найденным Findimage.

2.39
Исправил ошибку "-4", возникающую, если координата и путь к файлу не разделены пробелом.

2.41
В команду 'findimage' добавил код ошибки '-7' - нечего искать, искомая картинка пустая.