|
|
|
Поиск картинки в игре на MEmu |
|
|
PostByMik |
25.10.2020, 17:09
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Пытаюсь понять логику работы команды findimage, пока попытки успехом не увенчались. Знающие люди, подскажите, пожалуйста, как работает, какова логика работы данной команды: 1. Можно ли сделать скрин области в игре на эмуляторе MEmu (естественно в формате .bmp 24 бита) и далее её искать в указанной области или это так не работает? 2. если первый пункт не верный, то как надо? А теперь сама задача, которую я пытаюсь решить. Есть игра, в игре есть карта, на карте с определенным промежутком времени появляется караван, на который надо кликнуть и провести еще пару манипуляций мышью. Пытаюсь пока написать код, что бы он находил караван и кликал на него (после нажатия на него откроется меню ну и дальше уже обычные клики и ожидания, этому, вроде, я научился.) Код --lua local startX, startY, endX, endY = 0, 0, 830, 465 -- координаты поиска local path = [["C:\Caravan.bmp"]] -- путь к картинке, bmp 24 бита local arr, a = findimage (startX, startY, endX, endY, {path}, 2, 70, 1, 25) -- поиск картинки hint (a) -- результат поиска, подсказка в правом нижнем углу if arr then -- если найдена log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2]) kleft (arr[1][1], arr[1][2]) -- кликнули end
Это скрин карты в игре с караваном на ней, пытался на нем потренироваться, не находит (
Caravan.bmp ( 18,36 килобайт )
Кол-во скачиваний: 175 Это скрин самого каравана, который надо найти. Что я делаю не так, подскажите, пожалуйста.
|
|
|
|
PostByMik |
25.10.2020, 19:28
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Я во всем этом новичек, пытаюсь понять сам, но предоставленная информация в wiki очень скудна. Цитата getimage или printscreen getimage - Возвращает 4 параметра: Адрес в памяти, Ширина, Высота, Длина строки в байтах. - Куда она их возвращает (предполагаю, что можно в лог написать, но что мне с этим потом делать?) апд. Попробовал получить картинку при помощи getimage - получаю адресс в памяти и ширина/высота/длина. Далее пробую сохранить, при помощи saveimage - получаю огромный скрин рабочего стола, который начинается в указанной мною области в окне, а заканчивается он вообще где-то за пределами экрана ( Код --lua address, width, height, length = getimage (262, 216, 334, 243) log (address) -- адрес в памяти log (width) -- ширина изображения log (height) -- высота изображения log (length) -- длина строки в байтах
получаю 1247254 -> 11667284 -> CenterWidgetWindow 19:46:53 0 (Глобальный.txt, 0): 93085728 19:46:53 0 (Глобальный.txt, 0): 837 19:46:53 0 (Глобальный.txt, 0): 471 19:46:53 0 (Глобальный.txt, 0): 2512 Пытался получить черный квадратик, где таймер. апд2 какую бы я не попытался получить картинку при помощи getimage, все одинаковой высоты, ширины и длины, только адрес разный каждый раз. Значит я что-то делаю не то (
|
|
|
|
cirus |
25.10.2020, 20:17
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26691
Пользователь №: 16.971
Возраст: 29
|
getimage неправильно работает при работе с экраном, нужно указывать хендл окна. Код --lua local address, width, height, length = getimage (262, 216, 334, 243, workwindow()) saveimage (address, [[C:\picture.bmp]]) deleteimage (address) Если нужно сохранить скрин, то проще использовать printscreen. Код --lua printscreen (0, 500, 500, 200, 200, [[C:\window2.jpg]]) -- скрин экрана от координат 500 500, размером 200*200 Цитата К примеру, откуда брать координаты для getimage? Ctrl+A.
|
|
|
|
PostByMik |
25.10.2020, 20:32
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата getimage неправильно работает при работе с экраном, нужно указывать хендл окна. Так нашел и сохранил сразу. Спасибо огромное! Теперь, при попытке использовать код из начала темы на поиск картинок, но уже с новой искомой картинкой получаю в углу экрана сообщение-7 Подскажите, пожалуйста, что тут я не учел? Апд понял, что '-7' нечего искать, искомая картинка пустая. Но не понял что не так сделал) Цитата А лучше бело-черный, т. е. белую часть под караваном и черную где время. Только нужно закрасить левый верхний пиксель в любой цвет. т.е. мне сделать скрин области чуть захватив белую область, внутри которой черный квадрат? По поводу левого верхнего пикселя не понял ( Что там с ним будет не так? Мне в паинте открыть полученый скрин и там левый верхний пиксель закрасить, такое возможно?
|
|
|
|
PostByMik |
25.10.2020, 20:54
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата Прикрепленный файл Скрин.bmp ( 1,69 килобайт ) Искренне благодарен, с этим файлом работает, но беда в том, что я сам не смогу повторить в будущем, так как не понял сути. Пожалуйста, дайте пояснение как сделать то, что вы сделали. P.S. но понял, что для поиска достаточно фрагмента искомого изображения, по которому не будет других совпадений. За это отдельное спасибо. Осталось понять про пиксель. Зачем его красить? И как правильно это делать?
|
|
|
|
PostByMik |
25.10.2020, 21:14
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Спасибо за ответ! Я понимаю, что Вам с высоты Вашего полета все очевидно и просто, но поверьте, я не от скудности ума задаю вопрос. Дьявол кроется в мелочах) А для чего красить этот пиксель? апд Как команде printscreen обозначить рабочее окно? Код --lua printscreen (0, 483, 198, 200, 200, [[C:\window2.bmp]])
Что поставить вместо первого ноля? Если ставлю workwindow() то получаю скрин залитый черным цветом (
|
|
|
|
cirus |
25.10.2020, 21:51
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26691
Пользователь №: 16.971
Возраст: 29
|
Цитата А для чего красить этот пиксель? Цитата Цвет крайнего пикселя в левом верхнем углу изображения считается "цветом фона", и при поиске картинки на экране не учитывается. Например, цвет этого пикселя красный (255). В этом случае все пиксели красного цвета присутствующие на искомой картинке будут считаться фоновыми (прозрачными) и не будут сравниваться с тем, что присутствует на экране. Поэтому, нельзя чтобы в файле-картинке все пиксели были одного цвета. Нужно сделать, чтобы хотя бы один левый верхний пиксель цветом отличался от остальных. Цитата Что поставить вместо первого ноля? Код --lua local ffi = require("ffi") local GA_ROOTOWNER = 3 ffi.cdef[[int GetAncestor(int hwnd, unsigned int gaFlags);]]
printscreen (ffi.C.GetAncestor(workwindow(), GA_ROOTOWNER), 483, 198, 200, 200, [[C:\window2.bmp]])
|
|
|
|
PostByMik |
26.10.2020, 19:28
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Подскажите, пожалуйста, как решить проблему. Код local arr, a = findimage (0, 70, 831, 465, {"Золото.bmp"}, 2, 75, 20, 10) -- поиск картинки, должна быть в папке с пилотом 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
Это часть кода, которая ищет картинку и кликает на неё. это скрин карты
Золото.bmp ( 1,13 килобайт )
Кол-во скачиваний: 147 это вариант картинки для поиска
монета.bmp ( 2,04 килобайт )
Кол-во скачиваний: 140это второй вариант для поиска Проблема в том, что если корректировать точность совпадения и т.п. то я или нахожу слишком много картинок (на самом деле их не много) либо находится меньше чем есть на карте на самом деле. Не знаю как решить проблему. Может исходный как-то по другому сделать? Есть вариант сделать кучу разных вариантов картинок для поиска и пробегаться по всем по очереди, но этого делать не хотелось бы, и не факт, что получится хорошо.
|
|
|
|
cirus |
27.10.2020, 4:00
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26691
Пользователь №: 16.971
Возраст: 29
|
Можно удалить из массива лишние картинки. код
Код --lua function point_dist(x, y, x2, y2) return math.sqrt((x2-x)^2+(y2-y)^2) end function del(array, delta) while true do local flag = 0 for i=1, #array-1 do for j=#array, i+1, -1 do if point_dist(array[i][1], array[i][2], array[j][1], array[j][2]) < delta then flag = 1 table.remove(array, j) end end end if flag == 0 then break end end end
log'clear' log'mode compact'
local arr, a = findimage (0, 70, 831, 465, {'Золото.bmp'}, 2, 70, -1, 10) -- поиск картинки, должна быть в папке с пилотом --hint (a) -- результат поиска, подсказка в правом нижнем углу if arr then -- если найдена log ("Найдено картинок: " .. tostring(#arr)) del(arr, 50) -- функция удаляет из массива все картинки, между которыми расстояние меньше 50 пикселей (подобрать нужно значение) log ("Осталось картинок: " .. tostring(#arr))
for i=1, #arr do move (arr[i][1], arr[i][2]) -- навести курсор на картинку wait (1000) -- пауза 1000 мсек (1 сек) end end
|
|
|
|
PostByMik |
27.10.2020, 8:20
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата код Ох! Спасибо! А можно пояснить что тут к чему? Нижняя часть понятна, а вот верхняя моим умом, который всего неделю как познакомился со всем этим миром похоже на "крибли-крабли-крабс!")) Апд При использовании этого кода получаю сообщение о количестве найденных картинок, и остатке после обработки. Как я понял, обработка отсеивает "явно ненужные" картинки, те что слишком близко. Но после нее ничего не происходит. Никаких нажатий на оставшиеся. К тому же, есть некоторые "нужные картинки", которые перекрывают или стоят впритык др к др. ( Наверное, нужно "танцевать" с вариантами картинок для обработки (пока не получается)... Апд Пригляделся, а там и нет кликов в коде)
|
|
|
|
dimas01 |
27.10.2020, 13:23
|
Registred
Сообщений: 7
Регистрация: 27.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.785
Возраст: 24
|
На эту же тему вопрос. Надеюсь автор темы не против будет. Вообще никак не работает функция ФайндИмадж Прикол в том что если втыкаю такой скрипт: --lua local startX, startY, endX, endY = 0, 0, 830, 465 -- координаты поиска local path = [["C:\Caravan.bmp"]] -- путь к картинке, bmp 24 бита local arr, a = findimage (startX, startY, endX, endY, {path}, 2, 70, 1, 25) -- поиск картинки hint (a) -- результат поиска, подсказка в правом нижнем углу if arr then -- если найдена log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2]) kleft (arr[1][1], arr[1][2]) -- кликнули end то сразу выдает мессадж об ошибке https://prnt.sc/v7s6wa а вот с таким скриптом работает: set #needClick 1 set $path = [[C:\Script_ru53\Picture\]] set $image = {"Untitled-01", "Untitled-02", "Untitled-03", "Untitled-04"} //:metka for #i 1 2 //#size 1 set #a findimage (0, 0, 1890, 1010, ("C:\\Script_ru53\\Picture\\Untitled023.bmp"), 1) set %arr, #a findimage (0, 0, 1890, 1010, ("C:\\Script_ru53\\Picture\\Untitled023.bmp"), 2) set $X %a[1][1] //arr[#i][1] set $Y %arr[1 2] log ("надпись в логе: " .. $arr .. #a .. $X .. $Y .. $arr[1][1]) wait 2000 if $a != NULL //then kleft %arr[1][1] %arr[1][2] //%a[#i][1] %a[#i][2] set $farm1 1 send $farm1 sendex 1 wait 1000 end_if end_for //goto metka //////////////////// set #needClick 0 wait 1s stop_script Картинку находит. присваивает #a значение 100, то есть стопроцентовое совпадение, а вот координаты в массив %arr либо $arr либо #arr никак не вносит. там ноль. вернее даже не ноль, ругается что вообще не числовое значение. Шо робоить, братцы?
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|