|
findimage в LUA |
|
|
sutra |
26.1.2022, 13:34
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Нашёл где-то на задворках вариант использования финда. Даю обломок кода, думаю вопросов не будет. код
Код local screen = loadimage ([[Empire.bmp]]) -- загрузка скрина экрана поиска -- или если использовать getimage то так: screen = getimage (......) -- screen - это адрес в памяти (остальные три параметра обычно и не нужны) local pict = loadimage ([[gold.bmp]]) -- загрузка искомой картинки -- pict - - это тоже адрес в памяти (остальные 3 параметра игнорированы)
local accuracy = 80 -- точность поиска local count = -1 -- искать все картинки local deviation = 30 -- погрешность оттенка (абсолютная = 76 единицам = 30% от 255) local arr = findimage (x1, y1, x2, y2, {pict}, screen, accuracy, count, deviation)
|
|
|
|
apaul |
26.1.2022, 20:23
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Цитата(sutra @ 26.1.2022, 13:34) Нашёл где-то на задворках вариант использования финда. Даю обломок кода, думаю вопросов не будет.
Да,спасибо большое, тоже нашел этот же пример (IMG: style_emoticons/default/biggrin.gif). Это из описания, насколько понимаю, вашего самописного варианта финда. Пока еще с ним руки не дошли как следует поэкспериментировать, но сразу возник вопрос, чтобы 2 раза не вставать (IMG: style_emoticons/default/smile.gif) А если с его помощью пытаться распознавать цифры, будет толк по сравнению со стандартным? Смущает в первую очередь огромный буфер для каждого шаблона, коих по идее надо 1 - для экрана и по 1-3 на каждую цифру, т.е. около 20-25 штук. Или быстрее получится подгружать каждый шаблон перед поиском? Не экспериментировали с такой задачей?
|
|
|
|
apaul |
26.1.2022, 23:26
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Цитата(Madeus @ 26.1.2022, 22:29) Вот рабочий вариант поиска чиселМожет быть, но у меня в луа-варианте не заработал (IMG: style_emoticons/default/sad.gif). Ну и ладно - не в том интерес. Хочется узнать, стОит надеяться на увеличение скорости с самописным финдом или тут он проиграет?
|
|
|
|
apaul |
27.1.2022, 0:33
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Помогите, что-то никак не взлетает, и не пойму куда копать. Ошибок нет, просто не ищет - и все. код: Код --lua log 'clear' log 'mode compact' path = [[d:\Games\UOpilot\test\]] local pict = loadimage (path..[[examle.bmp]]) local screen, width, height, length = getimage (0, 0, 1279, 1023, "abs")
local x1, y1, x2, y2 = 570, 30, 570+160, 30+70 local arr1, a1 = findimage (x1, y1, x2, y2, {pict}, 2, 85, 1, 5, "abs") if arr1 then log ("экран - совпадение " .. a1 .. " координаты " .. arr1[1][1], arr1[1][2]) else log ("экран не найден") end
local arr, a = findimage (x1, y1, x2, y2, {pict}, screen, 85, 1, 5, "abs") if arr then log ("память - совпадение " .. a .. " координаты " .. arr[1][1], arr[1][2]) else log ("память не найден") end
deleteimage(screen) end_script()
и результат (IMG: style_emoticons/default/crazy.gif) Код экран - совпадение 93 координаты 601 53 память не найден
|
|
|
|
sutra |
27.1.2022, 11:31
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
По поводу буферов. Ну их размер и их количество Вы можете менять под свои задачи. А вообще там нет никаких ограничений. Буфер - он на то и буфер, он нужен только для загрузки изображений, а сами изображения, которые создаются функцией CreateFindArray распёхиваются по своим переменным, которые потр<вырезано анти-матом>ют памяти ровно столько, сколько требуется и ни байтом больше. Я при старте скрипта загружаю все изображения сразу их у меня очень много, не считал точно, но более 2 000 всяких разных картинок и всё летает! Правда я использую свою функцию, которая грузит из бинарных файлов уже готовые, ранее сделанные функцией CreateFindArray изображения.
|
|
|
|
apaul |
27.1.2022, 14:57
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Цитата(sutra @ 27.1.2022, 11:31) Буфер - он на то и буфер, он нужен только для загрузки изображений, а сами изображения, которые создаются функцией CreateFindArray распёхиваются по своим переменным, которые потр<вырезано анти-матом>ют памяти ровно столько, сколько требуется и ни байтом больше. Я при старте скрипта загружаю все изображения сразу их у меня очень много, не считал точно, но более 2 000 всяких разных картинок и всё летает! Правда я использую свою функцию, которая грузит из бинарных файлов уже готовые, ранее сделанные функцией CreateFindArray изображения.
Т.е. я правильно понимаю, что CreateFindArray() на выходе возвращает адрес "трафарета", который при следующих вызовах никем не затрется и таким образом можно закидаться на старте необходимыми трафаретами и в процессе уже пользоваться ими? И попутно стало интересно, как тогда освобождается память из-под неиспользуемых трафаретов? В том смысле, надо-ли опасаться, что когда-нибудь что-то исчезнет из памяти? Или пока скрипт выполняется - все гарантированно будет на месте, используется оно или нет? ЗЫ: Бинарники вместо картинок Вам нужны, насколько понимаю, чисто для оптимизации начальной загрузки?
|
|
|
|
sutra |
27.1.2022, 17:00
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Трафарет - это массив данных, определяемый Вашей переменной. Он ничем не отличается от обычных массивов lua, Единственное отличие, что это тип СИ данных и индексация их начинается с нуля, а не с единицы (но Вам это вообще должно быть по-барабану). Например, Вы объявляете переменную которая создаст трафарет изображения кнопки из шаблона bmp файла:
local button=CreateFindArray({{path..[[!BUT.bmp]] ....}
У меня много версий этой функции, поэтому я опустил параметры. Она будет доступна везде, как обычная переменная, пока вы её не переопределите. Её точно так же может очистить сборщик мусора, если она больше нигде не будет использоваться. "Весит" массив button ровно столько сколько требуется для хранения данных об искомых пикселях картинки. ДА, для её создания будет использоваться буфер той битовой маски, которую Вы укажете или по умолчанию №1, но этот буфер можно использовать для инициализации ВСЕХ картинок, переведённых в формат для поиска.
Для поиска кнопки просто вызывается финд FindImage(......, button, ....) кнопка будет искаться там где надо, либо на экране, либо в памяти, по той битовой маске, по которой Вам требуется. Примерно так. Я конечно переделал тот пример модуля, который выкладывал, но принцип остался тот же и почти с теми же характеристиками скорости. НО, там нет обработки ошибок. Делал для себя, так что повнимательней.
Да. Бинарники - это ускорение загрузки, когда картинок тысячи - загрузка - мгновенно, а если лопатить в цикле функции CreateFindArray - это может занять несколько секунд (у меня около 5 сек.)
|
|
|
|
sutra |
27.1.2022, 17:22
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Грубо говоря, резюмируя. Создавайте сколько угодно так называемых трафаретов (шаблонов) из bmp файлов и оперируйте ими как обычными переменными lua. Если Ваши картинки не являются огромными, с памятью никаких проблем не будет. Можете посмотреть сами сколько "кушает" памяти Пилот, всё в пределах нормы. Я делал эту технологию именно для того, чтобы не маслать ВСЕ пиксели картинки, а создавать массив искомых пикселей. Самое главное, я могу создавать ЛЮБЫЕ трафареты, путём определения групп искомых пикселей, определять приоритет этих групп пикселей. Каждая группа пикселей трафарета может иметь свои уникальные параметры отклонений. То есть можно задать практически любые условия поиска.
Если же у Вас ну ОЧЕНЬ много картинок (скажем 10 тысяч) и они огромные (в трафарет входят все пиксели картинок и картинки размером 200 на 200). Тогда надо использовать вариант финда, который давал DarkMaster. Вроде у него была рабочая версия. У себя его идеи я не реализовал, вроде и так всё как надо работает. Парни вроде хотели доделать финд, но видимо плюнули на это. Но опять же это значит, что Вам придётся каждый раз загружать по новой картинку, а если их загрузить сразу ВСЕ, то какая РАЗНИЦА?????
|
|
|
|
apaul |
6.2.2022, 16:07
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Цитата(sutra @ 27.1.2022, 17:22) Создавайте сколько угодно так называемых трафаретов (шаблонов) из bmp файлов и оперируйте ими как обычными переменными lua.
Спасибо за ответы, изучаю потихоньку Ваш финд - тяжко мне перестроиться со встроенного, но вижу, что стОит, поскольку уперся в быстродействие и глюки оригинала. Если можно, буду задавать возникающие по ходу вопросы (может иногда глупые - заранее прошу прощения (IMG: style_emoticons/default/unsure.gif) ). А может и другим пригодится этот опыт (IMG: style_emoticons/default/rolleyes.gif) . Пока по функции CreateFindArray - на выходе, как понял, у нее всегда будет массив, и при успешном выполнении и при ошибке.? Можно-ли как-то по выходу проверять, загружена ли картинка и сформирован ли шаблон? М.б. по каким-то внутренним полям? - параметр LengthBM - зависит от области поиска или от полных размеров картинки, находящейся в буфере (мы ведь можем ограничить область поиска переменными x1,x2,y1,y2)? Ну и как быть, если этот параметр нужно указать при формировании шаблонов, но мы заранее не знаем область поиска (она вычисляется в процессе)? Как-то можно этот параметр корректировать "на лету" непосредственно перед вызовом финда?
|
|
|
|
apaul |
8.2.2022, 15:51
|
Neophyte
Сообщений: 36
Регистрация: 19.8.2021 Группа: Пользователи Наличность: 0
Пользователь №: 20.051
|
Цитата(sutra @ 8.2.2022, 14:15) Вроде состряпал мало-мальски ответы на вопросы. Ну и новую версию даю, она вроде поадекватней.
Спасибо огромное, буду осваивать помаленьку. Сильно глупыми вопросами постараюсь не отвлекать (IMG: style_emoticons/default/smile.gif).
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|