Findimage (Lua)

Материал из UoPilot
Перейти к навигации Перейти к поиску

Описание

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

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

Синтаксис

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

ResultArray, a = findimage (<StartX>, <StartY>, <EndX>, <EndY>, <{filename}>  [, type [, accuracy [, count [, deviation]]]] [, abs])

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

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

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

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

findoffsetx (50)    -- смещение вправо на 50 пикселей
findoffsety (30)    -- смещение вниз на 30 пикселей

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

Примеры

--lua
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска 
local path = [["C:\картинка.bmp"]]                   -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2)  -- поиск картинки
hint (a)     -- результат поиска, подсказка в правом нижнем углу
if arr then  -- если найдена
    log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
    kleft (arr[1][1], arr[1][2])  -- кликнули
end
-- в результате работы, если в заданной области картинка обнаружена, в массив %arr[1][1] будет записано значение координаты X
-- а в %arr[1][2] - значение координаты Y
--lua
-- поиск нескольких одинаковых изображений
-- если будет найдено больше 20 поиск прекратится, точность 70%, отклонение в цвете 5%
local arr, a = findimage (0, 0, 1920, 1080, {"картинка.bmp"}, 2, 70, 20, 5)  -- поиск картинки, должна быть в папке с пилотом
hint (a)     -- результат поиска, подсказка в правом нижнем углу
if arr then  -- если найдена
    log ("Найдено картинок: " .. #arr)
    for i=1, #arr do
        kleft (arr[i][1], arr[i][2])  -- кликнули на каждой
        wait (1000)  -- пауза 1000 мсек (1 сек)
    end 
end
--lua
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска
local path = [[C:\pilot]]                    -- путь к картинкам

local image = {"картинка", "картинка2", "картинка3"}   -- массив с именами картинок, имена могут быть любыми
hint ("Всего картинок для поиска " .. #image)
for i=1, #image do                     -- цикл для поиска картинок
    local arr, a = findimage (startX, startY, endX, endY, {path .. "\\" .. image[i] .. ".bmp"}, 2)  -- поиск картинки
    if  arr then
        move (arr[1][1], arr[1][2])    -- переместить курсор на найденную картинку
        wait (500)                     -- ждать 0,5 секунды
    end
end

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

--lua
local handle = findwindow ("Lineage2")   -- поиск окна, вместо 'Lineage2' написать нужное имя окна
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска
local path = [["C:\картинка.bmp"]]                    -- путь к картинке
if handle then
    local arr, a = findimage (startX, startY, endX, endY, {path}, handle[1][1])  -- поиск картинки
    hint (a)     -- результат поиска, подсказка в правом нижнем углу
    if arr then  -- если найдена
        log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
        left (arr[1][1], arr[1][2], handle[1][1])  -- кликнули, left работает не во всех приложениях
        -- move (arr[1][1], arr[1][2], handle[1][1])  -- навести курсор на картинку (раскомментировать строку чтобы сработало)
    else
        log ("Изображение не найдено")
    end
else
    log("Окно не найдено")
end

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

Findcolor (Lua)
Color (Lua)