Findimage
Описание
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
Смотрите также
История развития
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' - нечего искать, искомая картинка пустая.