Перейти к основному содержимому

Поиск изображения на экране (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.