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

> Поиск скученности пикселей, Готовый скрипт
cirus
сообщение 9.1.2017, 21:39
Сообщение #1


**********

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



Скрипт позволяет находить объекты различной формы по нескольким цветам.
Файл с функцией распаковать и положить рядом с 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 цвет.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
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
cirus   Обновил скрипт (в первом посте), исправлен небольш...   3.7.2018, 13:10
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


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

 

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