|
Поиск скученности пикселей, Готовый скрипт |
|
|
cirus |
9.1.2017, 21:39
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27517
Пользователь №: 16.971
Возраст: 29
|
Скрипт позволяет находить объекты различной формы по нескольким цветам. Файл с функцией распаковать и положить рядом с exe пилота. find_heap_pixel, Версия 4.0
find_heap_pixel4.zip ( 2,58 килобайт )
Кол-во скачиваний: 576 Минимальная версия пилота 2.41 http://uopilot.uokit.com/. Запускать пилот от администратора. Функция принимает таблицу с параметрами поиска. Передаваемая таблица: Код find = {0, 0, 1920, 1080, -- координаты поиска (через запятую можно указать шаг поиска, если требуется, по умолчанию шаг 1 1) radius = 10, -- радиус разброса пикселей min_pixel_count = 15, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе color = {63232, 4727553, 10213092}, -- цвет или несколько цветов min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета (необязательный параметр, по умолчанию 0) deviation = {2, 0, 1}, -- погрешность оттенка для каждого цвета (необязательный параметр, по умолчанию 0) min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе Код find = {0, 0, 1920, 1080, x = 10, y = 15, deltaX = 0, -- размер искомого объекта и смещение области поиска (необязательный параметр) min_pixel_count = 15, max_pixel_count = 1000, color = {63232, "84235-86027", "R(11)+G(73-80)+B(1)"}, min_pixel_color = {0, 0, 0}, deviation = {2, 0, 1}, min_color = 2} Функция возвращает 2 параметра: количество пикселей и массив с данными о группах. Массив содержит: Код КоординатаX КоординатаY Всего_пикселей в группе_1 Количество_пикселей_первого_цвета Второго_цвета и т. д КоординатаX КоординатаY Всего_пикселей в группе_2 Количество_пикселей_первого_цвета Второго_цвета и т. д Координаты X и Y это центр группы. Версия 4.0 1. Исправен баг. Версия 3.0: 1. Исправлен небольшой баг. Возвращалась таблица даже если группа не найдена, теперь если группа пикселей найдена вторым аргументом возвращает таблицу, иначе nill. Версия 2.0: Добавлено: 1. Цвет можно указывать в виде диапазона "84235-86027" и по каналам "R(11)+G(73-80)+B(1)". Если какой-то канал не указан, то он не проверяется. 2. Погрешность в цвете (deviation) может быть не целым числом. Разделитель точка, например: 1.5 - погрешность 1.5%. 3. Вместо радиуса объекта можно указать его размеры X и Y. 4. Если указан размер объекта X и Y можно сместить область поиска. deltaX (необязательный параметр, по умолчанию 0) обозначает на сколько пикселей сместить область поиска по оси X относительно первого найденного пикселя. Максимальное смещение +-X / 2. Картинка для пояснения
Примеры использования (возможно цвета придётся указать свои, в разных браузерах цвет может отличаться): Открыть картинку, запустить скрипт. Пример 1
Код --lua require("find_heap_pixel") -- загрузка функции
-- таблица с параметрами поиска local find = {0, 0, 1920, 1080, -- координаты поиска radius = 10, -- радиус разброса пикселей min_pixel_count = 15, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе color = {63232}, -- цвет или несколько цветов min_pixel_color = {0}, -- минимально количество пикселей каждого цвета deviation = {2}, -- погрешность оттенка для каждого цвета min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300) time = os.clock() local a, group = find_heap_pixel(find) -- вызов функции log ("Всего найдено пикселей: " .. a) log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек") if group then for i = 1, #group do log (i .. " " .. table.concat(group[i], " ", 1, 2)) move (group[i][1], group[i][2]) wait (500) end end Пример 2
Код --lua require("find_heap_pixel")
local find = {0, 0, 1920, 1080, radius = 50, min_pixel_count = 20, max_pixel_count = 1000, color = {3289082}, min_pixel_color = {0}, deviation = {1}, min_color = 1}
local find2 = {0, 0, 1920, 1080, radius = 50, min_pixel_count = 10, max_pixel_count = 100, color = {16183289, 11762371}, deviation = {1, 1}, min_color = 1}
log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300) time = os.clock()
local a, group = find_heap_pixel(find) log ("Всего найдено пикселей: " .. a) log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек") if group then for i = 1, #group do log (i .. " " .. table.concat(group[i], " ", 1, 2)) move (group[i][1], group[i][2]) wait (500) end end
time = os.clock() local b, group2 = find_heap_pixel(find2) log ("Всего найдено пикселей: " .. b) log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек") if group2 then for i = 1, #group2 do log (i .. " " .. table.concat(group2[i], " ", 1, 2)) move (group2[i][1], group2[i][2]) wait (500) end end Пример 3
Код --lua require("find_heap_pixel")
local find = {0, 0, 1920, 1080, radius = 45, min_pixel_count = 50, max_pixel_count = 1000, color = {7590904, 14870765}, min_pixel_color = {0, 0}, deviation = {2,2}, min_color = 2}
log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300) time = os.clock()
local a, group = find_heap_pixel(find) log ("Всего найдено пикселей: " .. a) log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек") if group then for i = 1, #group do log ("Группа " .. i .. ", Координаты: " .. table.concat(group[i], " ", 1, 2) .. ", Пикселей в группе: " .. group[i][3]) move (group[i][1], group[i][2]) wait (500) end end Для подбора оптимальных цветов рекомендуется использовать Unique Colors SearchСтарые версии (не актуальны): find_heap_pixel, Версия 3.0
find_heap_pixel3.zip ( 2,56 килобайт )
Кол-во скачиваний: 534 find_heap_pixel, Версия 2.0
find_heap_pixel2.zip ( 2,54 килобайт )
Кол-во скачиваний: 474 find_heap_pixel, Версия 1.0
Этот же скрипт на языке пилота (работает медленно)
Код set #r2 40 //радиус разброса точек set #min 3 //минимальное количество всех пикселей в группе set #max 500 //максимальное количество всех пикселей в группе init_arr %xy (1) 0 0 1920 1080 //область поиска init_arr %color (1) 3466222 7138805 2209471 3399657 //цвета для поиска (от 1 до 5 цветов) init_arr %m (1) 0 0 0 0 0 //минимальное количество пикселей каждого цвета с учётом % отклонения (всегда должно быть 5 чисел) init_arr %deviat (1) 1 1 1 1 0 // % отклонения для каждого цвета (всегда должно быть 5 чисел) set #mincol 2 //минимальное количество любого из указанных цветов (от 1 до 5) set #timeproc 0 // время для поиска, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 цвет
set linedelay 0 log mode compact while 1 = 1 log clear set size(%result) // уничтожить массив с прошлыми результатами поиска call heap %xy %color %m %deviat #r2 #min #max #mincol #timeproc if size(%result) > 0 // если найдено хотя бы 1 группа //save_array %result C:\resultarray.txt // массив с результатами поиска log Всего найдено size(%result) групп из #pixel пикселей. log for #i 1 size(%result) log Группа #i --- из %result [#i 3] пикселей %result [#i 4] %result [#i 5] %result [#i 6] %result [#i 7] %result [#i 8] log Начальные координаты группы: %result [#i 1] %result [#i 2] log end_for
// Вывод в hint (можно убрать), если рабочее окно находится не в левом верхнем углу монитора будет отображать со смещением set #timeout 1000 // сколько времени отображать hint call hint %result size(%result) #size1 #group #timeout set #group 0 set #size1 0 proc hint %result #size #size1 #group #timeout set #size1 #size1 + 1 set #group #group + 1 if #size = #size1 while 1 = 1 and timer < #timeout hint (16 clRed %result [#size1 1] %result [#size1 2] (#group)) wait 100 end_while else hint (16 clRed %result [#size1 1] %result [#size1 2] (#group)) call hint %result #size #size1 #group #timeout end_if end_proc // end_if end_while end_script
// процедура поиска proc heap %xy %color %m %deviat #r2 #min #max #mincol #timeproc set #current_script current_script set delimiter ' ' set #Xstart %xy[1 1] set #Ystart %xy[1 2] set #Xend %xy[1 3] set #Yend %xy[1 4] set #deviat maxx(%deviat[1]) set #pix 0 set #pix1 0 set #g 0 set size(%b) set size(%result) while size(%a) = 0 and (#timeproc > timer or #timeproc = 0) set #a findcolor(#Xstart #Ystart #Xend #Yend (%color[1]) %a 2 -1 #deviat) wait 10 end_while set #pixel.#current_script #a if #a > 0 gosub rgb for #i 1 size(%a) set #g #g +1 set #c1 0 set #c2 0 set #c3 0 set #c4 0 set #c5 0 for #j #i size(%a) set #r round(point_distance(%a[#i 1] %a[#i 2] %a[#j 1] %a[#j 2])) if #r < #r2 set #pixl #pix if %a[#j 3] >= %color[2 1] and %a[#j 3] <= %color[3 1] set #c1 #c1 +1 else if %a[#j 3] >= %color[2 2] and %a[#j 3] <= %color[3 2] set #c2 #c2 +1 else if %a[#j 3] >= %color[2 3] and %a[#j 3] <= %color[3 3] set #c3 #c3 +1 else if %a[#j 3] >= %color[2 4] and %a[#j 3] <= %color[3 4] set #c4 #c4 +1 else if %a[#j 3] >= %color[2 5] and %a[#j 3] <= %color[3 5] set #c5 #c5 +1 end_if end_if end_if end_if end_if set #pix #c1 +#c2 +#c3 +#c4 +#c5 if #pixl != #pix set %a[#j 4] #g else set %a[#j 4] 0 end_if end_if end_for init_arr %b (#g) %a[#i 1] %a[#i 2] #pix #c1 #c2 #c3 #c4 #c5 for #i #i size(%a) if %a[#i 4] = "" set #i #i -1 break end_if end_for end_for set #z 0 for #l 1 size(%b) if %b[#l 3] >= #min and %b[#l 3] <= #max if (%b[#l 4] >= %m[1 1] or %m[1 1] = 0) and (%b[#l 5] >= %m[1 2] or %m[1 2] = 0) and (%b[#l 6] >= %m[1 3] or %m[1 3] = 0) and (%b[#l 7] >= %m[1 4] or %m[1 4] = 0) and (%b[#l 8] >= %m[1 5] or %m[1 5] = 0) set #z1 0 for #m 4 8 if %b[#l #m] > 0 set #z1 #z1 +1 end_if end_for if #z1 >= #mincol set #z #z +1 init_arr %result (#z) %b[#l] end_if end_if end_if end_for for #i 1 size(%result) for #j 1 size(%result[]) set %result.#current_script [#i #j] %result [#i #j] end_for end_for end_if goto end
:rgb for #n 1 size(%color[1]) set #cvet %color[1 #n] set #a1 colortorgb(#cvet %rgb) set #dev 255*%deviat[1 #n]/100 set #bmin %rgb[1 3]-#dev set #bmax %rgb[1 3]+#dev if #bmax > 255 set #bmax 255 end_if if #bmin < 0 set #bmin 0 end_if set #gmin %rgb[1 2]-#dev set #gmax %rgb[1 2]+#dev if #gmax > 255 set #gmax 255 end_if if #gmin < 0 set #gmin 0 end_if set #rmin %rgb[1 1]-#dev set #rmax %rgb[1 1]+#dev if #rmax > 255 set #rmax 255 end_if if #rmin < 0 set #rmin 0 end_if set %color[2 #n] #bmin *256*256+#gmin *256+#rmin set %color[3 #n] #bmax *256*256+#gmax *256+#rmax end_for return
:end end_proc Скрипт позволяет находить объекты различной формы по нескольким цветам. Указать можно от 1 до 5 цветов. Версия пилота 2.38 или выше. https://youtu.be/zET6Qg9BROoРезультат из процедуры возвращается в массив %result. В первой строке массива информация по первой группе, во второй строке по второй и т. д. %result [1 1] - координата X первой группы %result [1 2] - координата Y первой группы %result [1 3] - из скольких пикселей состоит первая группа %result [1 4] - количество пикселей первого цвета %result [1 5] - второго (если указан) %result [1 6] - третьего %result [1 7] - четвёртого %result [1 8] - пятого Количество найденных групп size(%result). Количество найденных пикселей содержится в переменной #pixel. set #r2 40 - радиус разброса точек, примерный размер искомого объекта в пикселях, лучше указать больше, чем меньше. set #min 3 - минимальное количество всех пикселей в группе. set #max 500 - максимальное количество всех пикселей в группе. init_arr %xy (1) 0 0 1920 1080 - область поиска init_arr %color (1) 3466222 7138805 2209471 3399657 - цвета для поиска (от 1 до 5 цветов) init_arr %m (1) 0 0 0 0 0 - минимальное количество пикселей в группе каждого цвета с учётом deviation (всегда должно быть 5 чисел) init_arr %deviat (1) 1 1 1 1 0 - погрешность оттенка в % для каждого цвета (всегда должно быть 5 чисел) set #mincol 2 - минимальное количество любого из указанных цветов (от 1 до 5), например, в %color указано 4 цвета, чтобы пиксели считались одной группой, как минимум 2 цвета должны присутствовать. set #timeproc 0 - время для поиска цветов (вычисления в это время не входят), если 0 не выйдет из процедуры пока не найдётся хотя бы 1 цвет.
|
|
|
|
|
|
Ответов
cirus |
3.7.2018, 13:10
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27517
Пользователь №: 16.971
Возраст: 29
|
Обновил скрипт (в первом посте), исправлен небольшой баг. Скачайте его.
111.zip ( 2,5 мегабайт )
Кол-во скачиваний: 436 В архиве видео. Пример как найти координаты перса, найти координаты мобов и навести курсор на ближайшего к персу моба. Файл с функцией распаковать и положить рядом с exe пилота, открыть картинку в пайнте и запустить скрипт.
2018_07_03_153211.bmp ( 1,12 мегабайт )
Кол-во скачиваний: 741Скрипт, найти ближайшего к персу моба
Код --lua require("find_heap_pixel") -- загрузка функции
-- функция находит ближайшего к персу моба -- принимает координаты перса и массив с координатами мобов function min_distance(persX, persY, arr) local function distance(x1, y1, x2, y2) return math.sqrt((x1-x2)^2+(y1-y2)^2) end local min, minNum, dist = 9999999, -1 for i=1, #arr do dist=distance(persX, persY, arr[i][1], arr[i][2]) if dist < min then min=dist minNum=i end end return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба end ----------------
-- таблица с параметрами поиска мобов local mob = {0, 0, 1920, 1080, -- координаты поиска radius = 100, -- радиус разброса пикселей min_pixel_count = 30, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе color = {14122975}, -- цвет или несколько цветов min_pixel_color = {0}, -- минимально количество пикселей каждого цвета deviation = {5}, -- погрешность оттенка для каждого цвета min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
-- таблица с параметрами поиска перса local pers = {0, 0, 1920, 1080, -- координаты поиска radius = 80, -- радиус разброса пикселей min_pixel_count = 50, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе color = {4145143 , 1032191, 48127}, -- цвет или несколько цветов min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета min_color = 3} -- минимальное количество цветов, которые должны присутствовать в группе
local a, group = find_heap_pixel(mob) -- вызов функции local b, group2 = find_heap_pixel(pers) -- вызов функции --log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено
if group and group2 then -- если моб и перс найдены local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов move (x, y) -- навести курсор на моба -- тут нужные действия end
|
|
|
|
Сообщений в этой теме
cirus Поиск скученности пикселей 9.1.2017, 21:39 DarkMaster
Скоро будешь переписывать, чтобы работал быстро(т... 15.1.2017, 2:02 cirus Перенесено в первый пост. 29.7.2017, 3:43 DarkMaster Производительность сравнивал? 15.8.2017, 11:01 cirus
Сравнение не совсем корректное, т. к. изменён при... 15.8.2017, 12:02 rus2146 Здравствуйте ваш скрипт отлично работает но при по... 30.6.2018, 15:03 cirus Скрипт, который на луа или языке пилота? 30.6.2018, 15:34 rus2146
Скрипт, который на луа или языке пилота?
на луа 30.6.2018, 16:40 cirus Можно дописать нужные действия. Тут 2 варианта.
1.... 30.6.2018, 17:45 rus2146
Можно дописать нужные действия. Тут 2 варианта.
1... 30.6.2018, 19:55 dron4938
Можно дописать нужные действия. Тут 2 варианта.
1... 17.12.2021, 5:39 cirus
Разница только в том что параметры указываются в ... 30.6.2018, 20:12 rus2146
Разница только в том что параметры указываются в ... 1.7.2018, 14:24 cirus
На какие меняете? И что за ошибку пишет?
Картинк... 1.7.2018, 15:09 rus2146
На какие меняете? И что за ошибку пишет?
Картинк... 3.7.2018, 12:34 rus2146
Обновил скрипт (в первом посте), исправлен неболь... 6.7.2018, 11:25 cirus Кроме while 1 do надо ещё end добавлять.
while 1 d... 6.7.2018, 11:33 rus2146
Кроме while 1 do надо ещё end добавлять.
[code]wh... 6.7.2018, 12:36 Sts777 ФУНКЦИЯ ПЕРЕМЕЩАЕТ КУРСОР В ТОЧКУ 1,1 ЭКРАНА
Восп... 27.5.2019, 23:33 cirus Версия пилота какая? Попробуйте 2.40, в 2.41 менял... 28.5.2019, 15:07 dron4938 https://i.ibb.co/7WC8b3z/Screenshot-9.png
Не очень... 16.12.2021, 13:20 cirus
Да. Нет разницы в каком порядке они указаны. 16.12.2021, 15:21 cirus
Никак, это же не функция для распознавания текста... 17.12.2021, 11:17 Мащекус Всем привет!
Ребятушки, а в Lua вообще отдель... 14.2.2023, 20:28 Madeus https://forum.uokit.com/index.php?showtopic...dcol... 15.2.2023, 3:22 nykep эта функция слишком сложна для меня(хотя разбирать... 19.2.2023, 1:08 DarkMaster просто и элегантно. рекомендую делать getimage в д... 19.2.2023, 9:22 nykep
просто и элегантно. рекомендую делать getimage в ... 19.2.2023, 21:00 DarkMaster
В минус смысла делать нет - там мы уже проверили.... 19.2.2023, 10:55 nykep
В минус смысла делать нет - там мы уже проверили.... 19.2.2023, 14:57 nykep наверное по Х все таки надо отнимать, например есл... 19.2.2023, 15:33 DarkMaster Пожалуй соглашусь. 19.2.2023, 17:18 DarkMaster пример фунции под имидж.
Я не могу дать никакой га... 19.2.2023, 21:38 nykep с размерами понятно, спасибо, хочу только уточнить... 19.2.2023, 22:04 DarkMaster да 19.2.2023, 22:12 nykep в общем у меня че то не получается, нарисовал в пэ... 20.2.2023, 1:02 DarkMaster
local ffi=require "ffi"
local rmem=ffi.ca... 20.2.2023, 8:41 nykep блин, это для меня темный лес. Единственное, могу ... 20.2.2023, 17:08 Madeus Попробуйте брать getimage с привязанного окна, обы... 20.2.2023, 19:01 nykep переделал свой вариант, теперь не застревает на пе... 16.5.2023, 16:25 DarkMaster find = {540, 160, 857, 428,
radius = 10,
min_... 28.1.2024, 18:40 DarkMaster Чет так и не завелось - нули возвращало.
-- resul... 5.2.2024, 15:43
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|