Скрипт позволяет находить объекты различной формы по нескольким цветам.
Файл с функцией распаковать и положить рядом с exe пилота.
find_heap_pixel, Версия 4.0
find_heap_pixel4.zip ( 2,58 килобайт )
Кол-во скачиваний: 472 Минимальная версия пилота 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 килобайт )
Кол-во скачиваний: 465 find_heap_pixel, Версия 2.0
find_heap_pixel2.zip ( 2,54 килобайт )
Кол-во скачиваний: 404 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 цвет.