Findimage (Lua)

Материал из UoPilot
Версия от 20:53, 27 августа 2019; Tatikoma (обсуждение | вклад) (Новая страница: «== Описание == '''findimage''' - поиск изображения в области заданной начальными и конечными коор...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Описание

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

Синтаксис

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

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

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

Коды ошибок FindImage:<br> '-1' упало при поиске, точная причина не известна.<br> '-2' не нашли открывающую скобку после имени функции.<br> '-3' не найдено пути в скобках.<br> '-4' ошибка поиска файла.<br> '-5' ошибка обработки искомого изображения.<br> '-6' ошибка получения изображения с экрана.<br> '-7' нечего искать, искомая картинка пустая. <br><br>Иногда требуется сделать клик не по самому изображению, а со смещением. Указывать можно как вначале скрипта так и перед функцией 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 = <nowiki>"C:\картинка.bmp"</nowiki>                   -- путь к картинке, 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 = 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 = <nowiki>C:\pilot</nowiki>                    -- путь к картинкам

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

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

--lua
local handle = findwindow ("RPG")   -- поиск окна, вместо 'Lineage2' написать нужное имя окна
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска
local path = <nowiki>"C:\картинка.bmp"</nowiki>                    -- путь к картинке
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) <br>Color (Lua)