Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> Поиск картинки в игре на MEmu
PostByMik
сообщение 25.10.2020, 17:09
Сообщение #1


**

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
Это скрин самого каравана, который надо найти.

Что я делаю не так, подскажите, пожалуйста.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.10.2020, 17:37
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
1. Можно ли сделать скрин области в игре

Для чего? getimage или printscreen.
Часто изображения в игре отличаются, видно при увеличении.
Вместо каравана можно искать белый прямоугольник. А лучше бело-черный, т. е. белую часть под караваном и черную где время. Только нужно закрасить левый верхний пиксель в любой цвет.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 25.10.2020, 19:28
Сообщение #3


**

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, все одинаковой высоты, ширины и длины, только адрес разный каждый раз. Значит я что-то делаю не то (
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 25.10.2020, 20:11
Сообщение #4


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Дайте, пожалуйста, адекватный пример. Со всеми требованиями, что должно быть, без чего не будет работать.
К примеру, откуда брать координаты для getimage? Просто ручками с экрана смотреть ориентировочные координаты?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.10.2020, 20:17
Сообщение #5


**********

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.

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 25.10.2020, 20:32
Сообщение #6


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Цитата
getimage неправильно работает при работе с экраном, нужно указывать хендл окна.

Так нашел и сохранил сразу. Спасибо огромное!

Теперь, при попытке использовать код из начала темы на поиск картинок, но уже с новой искомой картинкой получаю в углу экрана сообщение-7

Подскажите, пожалуйста, что тут я не учел?

Апд
понял, что '-7' нечего искать, искомая картинка пустая. Но не понял что не так сделал)

Цитата
А лучше бело-черный, т. е. белую часть под караваном и черную где время. Только нужно закрасить левый верхний пиксель в любой цвет.

т.е. мне сделать скрин области чуть захватив белую область, внутри которой черный квадрат?
По поводу левого верхнего пикселя не понял (
Что там с ним будет не так?
Мне в паинте открыть полученый скрин и там левый верхний пиксель закрасить, такое возможно?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.10.2020, 20:41
Сообщение #7


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
По поводу левого верхнего пикселя не понял

Прикрепленный файл  Скрин.bmp ( 1,69 килобайт ) Кол-во скачиваний: 151
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 25.10.2020, 20:54
Сообщение #8


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Цитата
Прикрепленный файл Скрин.bmp ( 1,69 килобайт )


Искренне благодарен, с этим файлом работает, но беда в том, что я сам не смогу повторить в будущем, так как не понял сути.

Пожалуйста, дайте пояснение как сделать то, что вы сделали.

P.S. но понял, что для поиска достаточно фрагмента искомого изображения, по которому не будет других совпадений. За это отдельное спасибо.
Осталось понять про пиксель. Зачем его красить? И как правильно это делать?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.10.2020, 21:08
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
Осталось понять про пиксель. Зачем его красить? И как правильно это делать?

Открыть искомую картинку в Paint, выбрать карандаш и любой цвет ... дальше и так понятно что делать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 25.10.2020, 21:14
Сообщение #10


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Спасибо за ответ!
Я понимаю, что Вам с высоты Вашего полета все очевидно и просто, но поверьте, я не от скудности ума задаю вопрос. Дьявол кроется в мелочах)

А для чего красить этот пиксель?

апд
Как команде printscreen обозначить рабочее окно?

Код

--lua
printscreen (0, 483, 198, 200, 200, [[C:\window2.bmp]])


Что поставить вместо первого ноля?
Если ставлю workwindow() то получаю скрин залитый черным цветом (
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.10.2020, 21:51
Сообщение #11


**********

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]])
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 25.10.2020, 21:52
Сообщение #12


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Спасибо огромное за пояснения!

Код буду переваривать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 26.10.2020, 0:05
Сообщение #13


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2399
Пользователь №: 18.746



Цитата(PostByMik @ 25.10.2020, 20:54) *

Осталось понять про пиксель. Зачем его красить? И как правильно это делать?

Важная информация -> Полезные сведения -> #5.

Ответы на многие вопросы вы найдете в этой теме.
Также просто периодически заглядывайте туда, это поможет вам быстрее освоить UO Pilot.

Сообщение отредактировал Fors1k - 26.10.2020, 0:05


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 26.10.2020, 19:28
Сообщение #14


**

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
это второй вариант для поиска

Проблема в том, что если корректировать точность совпадения и т.п. то я или нахожу слишком много картинок (на самом деле их не много) либо находится меньше чем есть на карте на самом деле.

Не знаю как решить проблему. Может исходный как-то по другому сделать?

Есть вариант сделать кучу разных вариантов картинок для поиска и пробегаться по всем по очереди, но этого делать не хотелось бы, и не факт, что получится хорошо.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 26.10.2020, 19:44
Сообщение #15


***********

Модератор UOPilot
Сообщений: 9.463
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27677
Пользователь №: 11.279



Я бы рекомендовал:
1) вырезать правый нижний угол захватывая тень
2) либо центр вертикально с захватом тени выше прямоугольника и захватом части черного круга.

Сообщение отредактировал DarkMaster - 26.10.2020, 19:46


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.10.2020, 4:00
Сообщение #16


**********

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
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 27.10.2020, 8:20
Сообщение #17


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Цитата
код

Ох! Спасибо!
А можно пояснить что тут к чему?

Нижняя часть понятна, а вот верхняя моим умом, который всего неделю как познакомился со всем этим миром похоже на "крибли-крабли-крабс!"))

Апд
При использовании этого кода получаю сообщение о количестве найденных картинок, и остатке после обработки.
Как я понял, обработка отсеивает "явно ненужные" картинки, те что слишком близко. Но после нее ничего не происходит. Никаких нажатий на оставшиеся.
К тому же, есть некоторые "нужные картинки", которые перекрывают или стоят впритык др к др. (

Наверное, нужно "танцевать" с вариантами картинок для обработки (пока не получается)...

Апд
Пригляделся, а там и нет кликов в коде)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.10.2020, 11:20
Сообщение #18


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Кстати, искать картинки можно и такого вида:
Прикрепленный файл  Золото2.bmp ( 20,67 килобайт ) Кол-во скачиваний: 144

Левый верхний пиксель красным цветом, поэтому всё что на картинке красным не будет учитываться при поиске.
Эту не использовать для поиска т. к. сделана со скрина из jpeg.
Цитата
К тому же, есть некоторые "нужные картинки", которые перекрывают или стоят впритык др к др.

Цитата
del(arr, 50) -- функция удаляет из массива все картинки, между которыми расстояние меньше 50 пикселей (подобрать нужно значение)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dimas01
сообщение 27.10.2020, 13:23
Сообщение #19


*

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 никак не вносит. там ноль. вернее даже не ноль, ругается что вообще не числовое значение.
Шо робоить, братцы?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.10.2020, 13:29
Сообщение #20


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
На эту же тему вопрос. Надеюсь автор темы не против будет.

Создавайте отдельную.
Цитата
то сразу выдает мессадж об ошибке

Нужен пилот версии 2.41, а не 2.39.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

4 страниц V  1 2 3 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 18.4.2024, 6:21
Designed by Nickostyle