Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 3.13 Поиск скученности пикселей определенных цветов на указанной площади (с разбегом в цвете)

Страниц (6): [1] 2 3 4 5 6 »
 

1. Kibor - 21 Января, 2014 - 18:27:54 - перейти к сообщению
findheapcolor - Ищет области на которых есть скученности пикселей определенных цветов. Можно искать на экране, окне или с двухмерном массиве int в котором находится изображение.

На видео демонстрируется работа этой функции в игре. Посмотреть видео поиска мобов в игре.
Тут демонстрируется поиск мультипликационного персонажа в реальном времени на видео.



Применяется для поиска объектов по указанию нескольких разных цветов которые есть в этом объекте и по ожидаемому размеру объекта (на этой площади должны найтись все пикселя). Можно указывать как разбежность цветов по RGB так и минимальное количество (оно может быть меньше) чем указанное количество цветов которые должны быть в объекте. Так же указывается область где больше не искать. Эта область располагается ниже первого найденного пикселя по Y и по середине по X.
К примеру одна сторона идентифицируется по 5 цветам
23432 6864554 99888 255 88989
а другая по
23432 6864554 99888 76645 88989
Поэтому в минимально требуемом количестве надо указать 4

Подобрать оптимальные цвета и их количество с учетом разбежности цвета можено с помощью этого инструмента Подбор Цвета Кибор.

синтаксис без разбежности в цвете:
findheapcolor(сколько_ищем, #color[0], #kol[0], сколько_цветов, сколько_цветов_надо_минимум, #x[0], #y[0], X_размер, Y размер, Размер_области_где не искать X, Размер_области_где не искать Y, старт_X_поиска, старт_Y_поиска, финиш_X_поиска, финиш_X_поиска, (указатель на окно или указатель на двухмерный массив int с изображением или -1));
синтаксис с разбежностью в цвете:
findheapcolor(сколько_ищем, #color[0], #kol[0], сколько_цветов, сколько_цветов_надо_минимум, #x[0], #y[0], X_размер, Y размер, Размер_области_где не искать X, Размер_области_где не искать Y, старт_X_поиска, старт_Y_поиска, финиш_X_поиска, финиш_X_поиска, Красный_меньше_на, Красный_больше_на, Зеленый_меньше_на, Зеленый_больше_на, Синий_меньше_на, Синий_больше_на , (указатель на окно или указатель на двухмерный массив int с изображением или -1));

Если первый параметр -1 - все искать.
#color[0] указатель на массив int в котором находятся искомые цвета пикселей
#kol[0] указатель на массив int в котором находятся сколько каждого цвета должно быть пикселей для того что бы цвет совпавшим считался. Например в kol[0] находится количество для color[0]. в kol[1] находится количество для color[1].
#x[0], #y[0] - int массив в котором будут координаты первого найденного пикселя в куче.

Возвращает количество найденных объектов.
Ошибки
-1 - массив приемника X меньше найденных скученностей
-2 - массив приемника X меньше найденных скученностей
-3 - размер ожидаемого объекта по X меньше области поиска
-4 - размер ожидаемого объекта по Y меньше области поиска
-5 - массив цветов меньше указанных в количестве в параметре 4
-6 - массив количества для каждого цвета меньше указанных в количестве в параметре 4

Пояснение:

Нажмите для увеличения


Пример поиска по картинке ниже. выберите 2 или 3 цвета:
CODE:
int min_col=3;//Найти если все три цвета
//int min_col = 2;//Достаточно только любых 2

int r=10;
int color[3];
color[0]=2366701; color[1]=5026082; color[2]=13387839;//Тут цвета
int kol[3];
kol[0]=55; kol[1]=55; kol[2]=55;//Тут сколько должно совпасть пикселей для каждого цвета
int x[50], y[50];//Тут координаты найденные
sleep(500);
int colors, xw, yw;
getdisplay(colors, xw, yw);
int k=findheapcolor(20, #color[0], #kol[0], 3, min_col, #x[0], #y[0], 15, 15, 50, 50, 0, 0, xw, yw, r, r, r, r, r, r, -1);

textbkcolor (8454143,255);
int n=0;
s:if (n<k)
{
textout(n, x[n], y[n] , format(n), 0);
mousemove(x[n], y[n]);
sleep(1000);
n++;
goto s;
}
messagebox (format(k)+" объектов нашли");


Нажмите для увеличения





Пример поиска мобов по картинке ниже:
CODE:
int color[3];
int r=5;
color[0]=2899273; color[1]=2899273; color[2]=791579;//Тут цвета
int kol[3];
kol[0]=25; kol[1]=25; kol[2]=25;//Тут сколько должно совпасть пикселей для каждого цвета
int x[50], y[50];//Тут координаты найденные
sleep(500);
int colors, xw, yw;
getdisplay(colors, xw, yw);
int k=findheapcolor(20, #color[0], #kol[0], 3, 3, #x[0], #y[0], 30, 30, 70, 80, 0, 0, xw, yw, r, r, r, r, r, r, -1);

textbkcolor (8454143,255);
int n=0;
s:if (n<k)
{
textout(n, x[n], y[n] , format(n), 0);
mousemove(x[n], y[n]);
sleep(1000);
n++;
goto s;
}
messagebox (format(k)+" объектов нашли");


Нажмите для увеличения


еще..
CODE:
int r=10;
int color[3], kol[3];
int x[20], y[20];
int colors, xw, yw;
color[0]=15990775; color[1]=8847032; color[2]=4192909;
kol[0]=1; kol[1]=1; kol[2]=1;
sleep(500);
getdisplay(colors, xw, yw);
int k=findheapcolor(20, #color[0], #kol[0], 3, 3, #x[0], #y[0], 30, 30, 50, 50, 0, 0, xw, yw, r, r, r, r, r, r, -1);

textbkcolor (8454143,255);
for (int n=0; n<k; n++)
{
textout(n, x[n], y[n] , format(n), 0);
mousemove(x[n], y[n]);
sleep(1000);
}
messagebox (format(k)+" объектов нашли");


Нажмите для увеличения


===========================================

Так указывается поиск на заранее созданном скрине
CODE:
int a[3000][2000];//Выделяем память. Выделить можно больше, с запасом, но не меньше. Если выделить меньше размеров скрина вернет ошибку.
screen (#a[0][0], 100, 200, 712, 636, -1);

int k=findheapcolor(20, #color[0], #kol[0], 3, 3, #x[0], #y[0], 15, 15, 50, 50, 475, 313, 575, 413, r, r, r, r, r, r, #a[0][0]);
//int k=findheapcolor(20, #color[0], #kol[0], 3, 3, #x[0], #y[0], 15, 15, 50, 50, 475, 313, 575, 413, #a[0][0]);
2. rev41k - 22 Января, 2014 - 10:56:20 - перейти к сообщению
чем быстрее искать при помощи finddynamic или findheapcolor?
3. Kibor - 22 Января, 2014 - 12:41:52 - перейти к сообщению
 rev41k пишет:
чем быстрее искать при помощи finddynamic или findheapcolor?

хм.. зависит от ситуации... если правильно применять findheapcolor то им.
если в нее засунуть цвет который много в фоне, то долго будет.. но так делать не надо так как нет смысла. к примеру если открыть блокнот - белый и искать на нем белый цвет с
findheapcolor(-1, #color[0], #kol[0], 3, 3, #x[0], #y[0], 30, 30, 30, 30 то долго. но так делать никто не будет, так как нет логики искать в объекте цвет который много в фоне...


ну а при правильном применение конечно findheapcolor будет быстрее, особенно если поставить findheapcolor(-1, #color[0], #kol[0], 3, 3, #x[0], #y[0], 30, 30, 80, 80 побольше. его надо так выставить что бы весь в него влез объект.

finddynamic изначально должен иметь между собой паузу. что б успел сменить экран картинку.

короче если findheapcolor подходит - то он.
если объекты полностью разные имеют цвета - finddynamic
4. rev41k - 22 Января, 2014 - 13:19:07 - перейти к сообщению
 Kibor пишет:
 rev41k пишет:
чем быстрее искать при помощи finddynamic или findheapcolor?

хм.. зависит от ситуации... если правильно применять findheapcolor то им.
если в нее засунуть цвет который много в фоне, то долго будет.. но так делать не надо так как нет смысла. к примеру если открыть блокнот - белый и искать на нем белый цвет с
findheapcolor(-1, #color[0], #kol[0], 3, 3, #x[0], #y[0], 30, 30, 30, 30 то долго. но так делать никто не будет, так как нет логики искать в объекте цвет который много в фоне...


ну а при правильном применение конечно findheapcolor будет быстрее, особенно если поставить findheapcolor(-1, #color[0], #kol[0], 3, 3, #x[0], #y[0], 30, 30, 80, 80 побольше. его надо так выставить что бы весь в него влез объект.

finddynamic изначально должен иметь между собой паузу. что б успел сменить экран картинку.

короче если findheapcolor подходит - то он.
если объекты полностью разные имеют цвета - finddynamic


Спасибо , учим findheapcolor();
5. Prusak - 05 Апреля, 2014 - 04:41:12 - перейти к сообщению
 Kibor пишет:
старт_X_поиска, старт_Y_поиска

если указать не 0,0 а допустим 640,35 чтоб сканировать не весь экран. то #x[0], #y[0] выдает искаженные координаты вообще в другой части экрана. хотя искомое находит.
6. HACMOPK - 05 Апреля, 2014 - 05:02:50 - перейти к сообщению
 Prusak пишет:
 Kibor пишет:
старт_X_поиска, старт_Y_поиска

если указать не 0,0 а допустим 640,35 чтоб сканировать не весь экран. то #x[0], #y[0] выдает искаженные координаты вообще в другой части экрана. хотя искомое находит.

Работаешь с экранными координатами или с оконными?
7. Prusak - 05 Апреля, 2014 - 05:18:27 - перейти к сообщению
PHP:
win aa=window ("- ArcheAge - Mar 27 2014 (03:47:57) Аранзеб", "ArcheAge", -1);
activate(aa);
////////////////////////////////////
int min_col=3;//Найти если все три цвета
int xw=1024;
int yw=768;
int r=10;
int color[3];
color[0]=12696972; color[1]=11971194; color[2]=10983788;//Тут цвета
int kol[3];
kol[0]=2; kol[1]=2; kol[2]=2;//Тут сколько должно совпасть пикселей для каждого цвета
int x[50], y[50];//Тут координаты найденные
sleep(500);
findheapcolor(1, #color[0], #kol[0], 3, min_col, #x[0], #y[0], 15, 15, 50, 50, 0, 0, xw, yw, r, r, r, r, r, r, aa);
mousemove(x[0], y[0],aa);
messagebox(format(x[0])+","+format(y[0]));

окно
(Добавление)
хм.. похоже это у меня какие то проблемы. даже из примера поиск 3Д моделей мышка перемещается куда угодно только не на моба.
8. HACMOPK - 05 Апреля, 2014 - 07:30:29 - перейти к сообщению
findheapcolor(1, #color[0], #kol[0], 3, min_col, #x[0], #y[0], 15, 15, 50, 50, 50, 70, xw, yw, r, r, r, r, r, r, aa);
mousemove(x[0]+50, y[0]+70,aa);
messagebox(format(x[0])+","+format(y[0]))
9. Prusak - 05 Апреля, 2014 - 07:56:27 - перейти к сообщению
 HACMOPK пишет:
findheapcolor(1, #color[0], #kol[0], 3, min_col, #x[0], #y[0], 15, 15, 50, 50, 50, 70, xw, yw, r, r, r, r, r, r, aa);
mousemove(x[0]+50, y[0]+70,aa);
messagebox(format(x[0])+","+format(y[0]))

спасибо заработало Улыбка но смысла не понял.
 Цитата:
#x[0], #y[0] - int массив в котором будут координаты первого найденного пикселя в куче.

я так подразумеваю что там находятся оконные координаты на который ссылается указатель аа,в mousemove как и в findheapcolor также имеется данный указатель. теперь получается функциям ссылающим на данный масив так же надо делать преписку +50 +70...ничего не понимаю поясните дураку как ето работает ?
10. HACMOPK - 05 Апреля, 2014 - 15:26:58 - перейти к сообщению
Допустим ищем красный цвет на экране.( 0, 0, xw, yw);
находим в координатах 255,255
mousemove(x[0], y[0],aa); все хорошо.
далее мы знаем что красного цвета в координатах 50,70 нет, задаем поиск ( 50, 70, xw, yw);
находим, но начальной точкой поиска служит точка 50,70 в результате получаем координаты 205,185.
mousemove(x[0], y[0],aa); начинает "движение" с 0,0 и приходит в координату 205,185.
Как- то так.

Powered by ExBB FM 1.0 Final