Поиск изображения на экране (screen.find_image)
Объявление
координата_x, координата_y = screen.find_image(изображение [, достоверность, левый, верхний, правый, нижний ])
результат_поиска = screen.find_image(изображение [, параметры, левый, верхний, правый, нижний ])
Параметры
-
Изображение
Строка с данными изображения в формате PNG или JPEG.
Объект изображения (см. модуль объектов изображений (image)).
Текстовый путь к файлу изображения. Если путь недействителен, значение разбирается как данные. -
Достоверность
Целое число, необязательный параметр. Возвращается только позиция с достоверностью не менее 95; диапазон значений — 0 ~ 100. -
Параметры
Таблица, необязательный параметр.Структура параметров
{
find_all = false | true, -- Необязательный параметр: при значении true ищет все совпадения и возвращает таблицу. По умолчанию false
confidence_threshold = number_value(0.0 ~ 100.0), -- Необязательный параметр: результат с достоверностью выше этого значения считается действительным. По умолчанию 95
downscale = number_value(0.1 ~ 1.0), -- Необязательный параметр: меньшее значение ускоряет поиск, но снижает точность. По умолчанию 1.0, приоритет точности
mask = image_object, -- Необязательный параметр: отмечает допустимую область искомого изображения. Это бинарное изображение того же размера, что и img; белый цвет обозначает допустимую область, чёрный — недопустимую. По умолчанию допустима вся область img
} -
Левый край, верхний край, правый край, нижний край
Целые числа, необязательные параметры, задающие область поиска; по умолчанию — весь экран.
Возвращаемое значение
-
Координата x, координата y
Целые числа. Еслипараметры.find_allне равно true, возвращает только координаты наиболее достоверного подходящего результата. Если подходящая по достоверности координата не найдена, возвращает -1, -1. -
Результат поиска
Таблица.Если параметры.find_all равно true, возвращается несколько значений с достоверностью не менее параметры.confidence_threshold
{
{
x = integer_value,
y = integer_value,
confidence = number_value(0.0 ~ 100.0),
},
...
}
Описание
Ищет изображение на экране; функция использует модуль image.cv.
Система координат параметров и возвращаемых значений этой функции зависит от системы, заданной функциейscreen.init.
Внимание: для совместимости с разными разрешениями рекомендуется делать снимок на устройстве с минимальным разрешением; снимок с большим разрешением нельзя сопоставить на устройстве с меньшим разрешением.
Улучшения в версиях 1.3.8 и выше
- В режиме
find_allможно найти все совпадения изображения, превышающие порог достоверности. - Поле
downscaleпозволяет снизить точность изображения для ускорения поиска. - С помощью
maskможно отметить допустимую область изображения и искать изображения неправильной формы.
Пример
XXT Color Picker для Windows.zip
-- Пример 1 (выделение области изображения сочетанием Shift + левая кнопка мыши в XXT Color Picker напрямую создаёт такой код):
x, y = screen.find_image( -- Положение исходного изображения: левый верхний угол 354, 274 | правый нижний угол 358, 284
"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x04\x00\x00\x00\x0a\x08\x02\x00\x00\x00\x1c\x99\x68\x59\x00\x00\x00\x61\x49\x44\x41\x54\x78\xda\x63\x78\xfd\xf4\xda\xff\xff\xff\xff\xfd\xfb\xf7\xed\xcb\x5b\x86\xf7\xaf\x1f\xfc\x87\x01\x86\x2f\x1f\x5f\x02\xa9\xef\xa7\xce\x7c\xdd\xb1\x9b\xe1\xe7\xf7\xcf\x40\xce\xeb\xb2\xea\x7b\xb2\x6a\x0c\x7f\xff\xfe\x01\x72\x9e\x78\x06\x82\x38\x20\xdd\xbf\x7e\xdd\x57\xd4\x82\x72\x7e\xdd\xba\x0d\x64\x41\x39\x08\xd3\x80\x38\x6b\xe3\x7f\x86\x2a\x30\x02\x72\x8c\xa6\x40\x39\x00\xd5\x7b\x5f\x2e\xfd\xba\xd5\x32\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
, 95, 0, 0, 639, 1135)
--
-- Пример 2:
img = image.load_file("/var/mobile/1.png")
x, y = screen.find_image(img)
x, y = screen.find_image(img, 95)
--
-- Пример 4:
x, y = screen.find_image("/var/mobile/1.png", 95, 0, 0, 639, 1135)
-- Пример 5 (добавлено в 1.3.8): поиск нескольких целей по всему экрану
img = image.load_file(XXT_SCRIPTS_PATH..'/1.png')
rets = screen.find_image(img, {
confidence_threshold = 90, -- Результат действителен, если его достоверность выше этого значения
downscale = 0.5, -- Снижение точности для ускорения
find_all = true, -- Поиск всех совпадений с возвратом таблицы их координат
}, 0, 0, 0, 0) -- Область 0, 0, 0, 0 обозначает весь экран
Примечание: в исходном коде Lua строка, начинающаяся с \x и содержащая после неё две шестнадцатеричные цифры, обозначает один байт с таким кодом. Например, \x58 обозначает символ X; см. печатаемую часть в статье «Кодировка ASCII».
Сложный пример
-- Загрузка небольшого изображения из интернета (части значка XXTouch), его поиск на экране и нажатие
local c, h, r = http.get("https://www.xxtouch.app/img/find_image_test.png", 10)
if (c == 200) then
local img = image.load_data(r)
if img then
x, y = screen.find_image(img, 95)
if x~=-1 then
touch.tap(x, y)
else
sys.alert("没有在屏幕上找到 XXTouch 图标")
end
else
sys.alert("下载的数据不是有效的图片")
end
else
sys.alert("下载失败")
end
Примечание: приведённый выше код использует функции не из этой главы: sys.alert, image.load_data, touch.tap, http.get.