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

3 страниц V  1 2 3 >  
Ответить в эту темуОткрыть новую тему
> findimage в LUA
apaul
сообщение 25.1.2022, 14:46
Сообщение #1


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Подскажите пожалуйста синтаксис findimage в LUA чтобы искать не с экрана, а в памяти, предварительно сохранив его getimage-ем. Шаблоны для поиска тоже находятся в памяти, загруженные через loadimage.
Заранее благодарен за помощь )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 26.1.2022, 13:34
Сообщение #2


*******

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)


Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 26.1.2022, 20:23
Сообщение #3


**

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 штук. Или быстрее получится подгружать каждый шаблон перед поиском? Не экспериментировали с такой задачей?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 26.1.2022, 22:29
Сообщение #4


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8476
Пользователь №: 19.451
Возраст: 32



Вот рабочий вариант поиска чисел
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 26.1.2022, 23:26
Сообщение #5


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Цитата(Madeus @ 26.1.2022, 22:29) *

Вот рабочий вариант поиска чисел

Может быть, но у меня в луа-варианте не заработал (IMG:style_emoticons/default/sad.gif). Ну и ладно - не в том интерес. Хочется узнать, стОит надеяться на увеличение скорости с самописным финдом или тут он проиграет?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 27.1.2022, 0:33
Сообщение #6


**

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


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Я давно не работаю со стандартом, могу ошибаться. Попробуйте убрать "abs" при втором поиске, он явно ни к чему, Вы же в памяти ищете.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.1.2022, 11:31
Сообщение #8


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



По поводу буферов. Ну их размер и их количество Вы можете менять под свои задачи. А вообще там нет никаких ограничений. Буфер - он на то и буфер, он нужен только для загрузки изображений, а сами изображения, которые создаются функцией CreateFindArray распёхиваются по своим переменным, которые потр<вырезано анти-матом>ют памяти ровно столько, сколько требуется и ни байтом больше. Я при старте скрипта загружаю все изображения сразу их у меня очень много, не считал точно, но более 2 000 всяких разных картинок и всё летает! Правда я использую свою функцию, которая грузит из бинарных файлов уже готовые, ранее сделанные функцией CreateFindArray изображения.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.1.2022, 11:49
Сообщение #9


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Если честно, я не знаю как бы я обходился без своих финдов. Это про смысл их использования. Конечно я под свои нужды, зная где, что и как надо искать сильно модифицировал шаблоны картинок. Скажем для некоторых шрифтов, цифры ищутся картинками от 1-го, до 4-х пикселей. У меня распознавание нескольких чисел и нескольких слов (из более чем 1000 шаблонов) ищутся быстрее, чем работает вызов одного стандартного getimage. Спасибо огромное Cirus за это.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 27.1.2022, 14:57
Сообщение #10


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Цитата(sutra @ 27.1.2022, 11:31) *

Буфер - он на то и буфер, он нужен только для загрузки изображений, а сами изображения, которые создаются функцией CreateFindArray распёхиваются по своим переменным, которые потр<вырезано анти-матом>ют памяти ровно столько, сколько требуется и ни байтом больше. Я при старте скрипта загружаю все изображения сразу их у меня очень много, не считал точно, но более 2 000 всяких разных картинок и всё летает! Правда я использую свою функцию, которая грузит из бинарных файлов уже готовые, ранее сделанные функцией CreateFindArray изображения.

Т.е. я правильно понимаю, что CreateFindArray() на выходе возвращает адрес "трафарета", который при следующих вызовах никем не затрется и таким образом можно закидаться на старте необходимыми трафаретами и в процессе уже пользоваться ими?
И попутно стало интересно, как тогда освобождается память из-под неиспользуемых трафаретов? В том смысле, надо-ли опасаться, что когда-нибудь что-то исчезнет из памяти? Или пока скрипт выполняется - все гарантированно будет на месте, используется оно или нет?
ЗЫ: Бинарники вместо картинок Вам нужны, насколько понимаю, чисто для оптимизации начальной загрузки?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.1.2022, 17:00
Сообщение #11


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Трафарет - это массив данных, определяемый Вашей переменной. Он ничем не отличается от обычных массивов lua, Единственное отличие, что это тип СИ данных и индексация их начинается с нуля, а не с единицы (но Вам это вообще должно быть по-барабану). Например, Вы объявляете переменную которая создаст трафарет изображения кнопки из шаблона bmp файла:

local button=CreateFindArray({{path..[[!BUT.bmp]] ....}

У меня много версий этой функции, поэтому я опустил параметры.
Она будет доступна везде, как обычная переменная, пока вы её не переопределите. Её точно так же может очистить сборщик мусора, если она больше нигде не будет использоваться. "Весит" массив button ровно столько сколько требуется для хранения данных об искомых пикселях картинки. ДА, для её создания будет использоваться буфер той битовой маски, которую Вы укажете или по умолчанию №1, но этот буфер можно использовать для инициализации ВСЕХ картинок, переведённых в формат для поиска.

Для поиска кнопки просто вызывается финд
FindImage(......, button, ....)
кнопка будет искаться там где надо, либо на экране, либо в памяти, по той битовой маске, по которой Вам требуется.
Примерно так. Я конечно переделал тот пример модуля, который выкладывал, но принцип остался тот же и почти с теми же характеристиками скорости. НО, там нет обработки ошибок. Делал для себя, так что повнимательней.


Да. Бинарники - это ускорение загрузки, когда картинок тысячи - загрузка - мгновенно, а если лопатить в цикле функции CreateFindArray - это может занять несколько секунд (у меня около 5 сек.)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.1.2022, 17:22
Сообщение #12


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Грубо говоря, резюмируя. Создавайте сколько угодно так называемых трафаретов (шаблонов) из bmp файлов и оперируйте ими как обычными переменными lua. Если Ваши картинки не являются огромными, с памятью никаких проблем не будет. Можете посмотреть сами сколько "кушает" памяти Пилот, всё в пределах нормы. Я делал эту технологию именно для того, чтобы не маслать ВСЕ пиксели картинки, а создавать массив искомых пикселей. Самое главное, я могу создавать ЛЮБЫЕ трафареты, путём определения групп искомых пикселей, определять приоритет этих групп пикселей. Каждая группа пикселей трафарета может иметь свои уникальные параметры отклонений. То есть можно задать практически любые условия поиска.

Если же у Вас ну ОЧЕНЬ много картинок (скажем 10 тысяч) и они огромные (в трафарет входят все пиксели картинок и картинки размером 200 на 200). Тогда надо использовать вариант финда, который давал DarkMaster. Вроде у него была рабочая версия. У себя его идеи я не реализовал, вроде и так всё как надо работает. Парни вроде хотели доделать финд, но видимо плюнули на это.
Но опять же это значит, что Вам придётся каждый раз загружать по новой картинку, а если их загрузить сразу ВСЕ, то какая РАЗНИЦА?????
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 6.2.2022, 16:07
Сообщение #13


**

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)? Ну и как быть, если этот параметр нужно указать при формировании шаблонов, но мы заранее не знаем область поиска (она вычисляется в процессе)? Как-то можно этот параметр корректировать "на лету" непосредственно перед вызовом финда?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 7.2.2022, 9:42
Сообщение #14


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Вы первый, кто заинтересовался моей "кухней", за всё это время. Тот вариант я дал чисто для примера работы. Он был состряпан на лету и вроде даже там была ошибочка. Вот сижу и думаю. То ли мне скачать тот вариант (у себя я уже всё переделал, а старое не сохранил), чтобы дать корректные ответы, то ли выложить обновлённый финд. В общем в любом случае нужно время, а я сейчас немного времени уделяю компу. Так что Вам придётся возможно подождать какое-то время. Постараюсь Вам помочь.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 7.2.2022, 10:26
Сообщение #15


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Скачал себе свой же файл. Да, я там прилично переделал код. В функции CreateFindArray вообще теперь нет параметра второго параметра L. Наверное надо новое выкладывать. Придётся подождать.

И прошу извинить меня. Я тут про буфер говорил. В старой версии нет никакого буфера, а вот в новой он есть. Я просто забыл, чего я там в своё время наваял.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 8.2.2022, 14:15
Сообщение #16


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Вроде состряпал мало-мальски ответы на вопросы. Ну и новую версию даю, она вроде поадекватней.

Только переименуйте cif2 в cif.


Прикрепленные файлы
Прикрепленный файл  Info_NewFind.zip ( 12,63 килобайт ) Кол-во скачиваний: 54
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
apaul
сообщение 8.2.2022, 15:51
Сообщение #17


**

Neophyte
Сообщений: 36
Регистрация: 19.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.051



Цитата(sutra @ 8.2.2022, 14:15) *

Вроде состряпал мало-мальски ответы на вопросы. Ну и новую версию даю, она вроде поадекватней.

Спасибо огромное, буду осваивать помаленьку. Сильно глупыми вопросами постараюсь не отвлекать (IMG:style_emoticons/default/smile.gif).
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 8.2.2022, 17:23
Сообщение #18


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Да не вопрос - спрашивай. Постараюсь ответить. Удачи!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 9.2.2022, 10:37
Сообщение #19


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



В качестве рекомендации. Иногда может казаться что картинка не ищется потому, что что-то сделано неправильно, а всё дело в значениях параметров поиска. Если нет точного понимания содержимого картинки и экрана поиска, рекомендую использовать проверенную комбинацию параметров, удовлетворяющую в подавляющем большинстве случаев. На одну единицу параметра dev задавать две единицы параметра acc, например: acc=10, dev=5.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 11.2.2022, 12:52
Сообщение #20


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Сорри, как обычно, чего в голову взбрело, то и пишу. Я имел ввиду 100% минус отклонение в 10%. То есть acc=90, dev=5.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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