Zireael |
Отправлено: 05 Ноября, 2020 - 14:13:46
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: есть картинка(для просмотра ссылки Вам необходимо авторизоваться) как записать в файл массив вида
code (Отобразить)CODE:int colors[2] = {2366701, 0} // красный, чёрный
int coord[4]={1043, 182, 1337, 412} // область поиска
// параметры findheapcolor
int color[1];
int kol[1]={200}; // сколько должно совпасть пикселей
int r=5; // отклонение в цвете
int PosX[99], PosY[99]; // координаты найденных объектов
// сколько строк и столбцов
int row = 3, column = 3;
int width_section = (coord[2] - coord[0]) / column; // ширина ячейки
int height_section = (coord[3] - coord[1]) / row; // высота ячейки
int count, i, j;
// массив для хранения позиций
new int array[row][column];
initialarray(#array[0][0], 0);
string path = "C:\array.txt"; // путь к файлу, куда сохранить массив
//поиск объектов
for(i=0; i<sizearray(colors); i++)
{
color[0]=colors[i];
count=findheapcolor(sizearray(PosX),#color[0],#kol[0],1,1,#PosX[0],#PosY[0], 100,50,100,50,coord[0],coord[1],coord[2],coord[3], r,r,r,r,r,r,-1);
//messagebox("Найдено: "+format(count));
if(count)
{
for(j=0; j<count; j++)
{
//mousemove(coord[0]+PosX[j], coord[1]+PosY[j]); sleep(500);
int positionX = PosX[j] / width_section;
int positionY = PosY[j] / height_section;
//messagebox(format(positionX)+" "+format(positionY));
array[positionY][positionX] = i+1;
}
}
else messagebox("Не найдено");
}
// записать массив в файл
if(fopen(path, "w"))
{
for(i=0; i<row; i++)
{
for(j=0; j<column; j++)fwrite(array[i][j]);
fwrite(ENDL);
}
fclose();
start(path);
}
findheapcolor можно заменить на findimage. |
|
|
stasrus |
Отправлено: 05 Ноября, 2020 - 14:54:47
|
Участник
Покинул форум
Сообщений всего: 62
Дата рег-ции: Сент. 2020
Репутация: -1
|
Zireael , Большое спасибо, очень помогает в освоении.
Если будет время, не могли бы вы пояснить чуть подробнее, не совсем понятно как это все работает.
например вот это место
CODE:
// массив для хранения позиций
new int array[row][column];
initialarray(#array[0][0], 0);
Из справки: Цитата: initialarray позволяет заполнить массив одинаковыми данными.
у нас же не одинаковые данные? может же быть много разных изображений
Да и с new не понятно для чего здесь?
Цитата: new - Динамичное выделение памяти
Дальше по функциям вроде могу примерно понять, но вот по логике скрипта совсем не понятно
CODE:
//поиск объектов
for(i=0; i<sizearray(colors); i++)
{
color[0]=colors[i];
count=findheapcolor(sizearray(PosX),#color[0],#kol[0],1,1,#PosX[0],#PosY[0], 100,50,100,50,coord[0],coord[1],coord[2],coord[3], r,r,r,r,r,r,-1);
//messagebox("Найдено: "+format(count));
if(count)
{
for(j=0; j<count; j++)
{
//mousemove(coord[0]+PosX[j], coord[1]+PosY[j]); sleep(500);
int positionX = PosX[j] / width_section;
int positionY = PosY[j] / height_section;
//messagebox(format(positionX)+" "+format(positionY));
array[positionY][positionX] = i+1;
}
}
else messagebox("Не найдено");
}
// записать массив в файл
if(fopen(path, "w"))
{
for(i=0; i<row; i++)
{
for(j=0; j<column; j++)fwrite(array[i][j]);
fwrite(ENDL);
}
fclose();
start(path);
}
Где место которое присваивает изображению цифру 1 или 2?
Если будет возможность прокомментируйте каждую строку чтобы понять что вообще происходит . не хочется просто скопировать кусок чужого кода, интересно добраться до сути.
чтобы вы понимали насколько это все не просто, свою часть кода я писал почти 6 часов. но там немного больше было кода, еще нужно было открывать изображения по массиву. и постоянно чтото не работало
(Добавление)
Ув Zireael , я там в личку отписал по другому вопросу(Отредактировано автором: 05 Ноября, 2020 - 15:01:22) |
|
|
ivantu |
Отправлено: 05 Ноября, 2020 - 15:47:07
|
Эксперт
Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013
Репутация: 14
|
stasrus пишет: массив одинаковыми данными.
Имеется ввиду данными одного типа к примеру int
New динамический массив который имеет приставку new*, т.е. массив может увеличиваться в процессе.
stasrus пишет: Где место которое присваивает изображению цифру 1 или 2?
Тут поиск цвета, а не картинок, т.е. в квадрате к примеру пикселей красного цвета 200, а в круге 180, по этому принципу идет отслеживание обьектов.
stasrus пишет: count=findheapcolor(sizearray(PosX),#color[0],#kol[0],1,1,#PosX[0],#PosY[0], 100,50,100,50,coord[0],coord[1],coord[2],coord[3], r,r,r,r,r,r,-1); |
|
|
Zireael |
Отправлено: 06 Ноября, 2020 - 01:16:35
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: initialarray позволяет заполнить массив одинаковыми данными.
у нас же не одинаковые данные? может же быть много разных изображений
Чтобы изначально заполнить какими-то данными. Можно не заполнять, если какой-то объект не найдется запишет в файл вместо 0 что-то вроде этого -842150451.
Цитата: Да и с new не понятно для чего здесь?
Чтобы размер массива задать перемеными.
Цитата: т.е. в квадрате к примеру пикселей красного цвета 200, а в круге 180, по этому принципу идет отслеживание обьектов.
Нет. Просто поиск по цвету, количество тут незачем учитывать.
Цитата: Если будет возможность прокомментируйте каждую строку чтобы понять что вообще происходит
CODE://поиск объектов
for(i=0; i<sizearray(colors); i++) // цикл для всех цветов в массиве
{
color[0]=colors[i]; // присвоить переменной цвет, который будем искать
count=findheapcolor(sizearray(PosX),#color[0],#kol[0],1,1,#PosX[0],#PosY[0], 100,50,100,50,coord[0],coord[1],coord[2],coord[3], r,r,r,r,r,r,-1);
//messagebox("Найдено: "+format(count));
if(count) // если объект найден
{
for(j=0; j<count; j++) // цикл для всех найденных объектов
{
//mousemove(coord[0]+PosX[j], coord[1]+PosY[j]); sleep(500);
int positionX = PosX[j] / width_section; // позиция объекта исходя из его позиции на поле и ширины столбца
int positionY = PosY[j] / height_section; // позиция объекта исходя из его позиции на поле и высоты строки
//messagebox(format(positionX)+" "+format(positionY));
array[positionY][positionX] = i+1; // записать в массив цифру
}
}
else messagebox("Не найдено");
}
Допустим, имеется поле в 3 столбца шириной 120 пикселей. Значит ширина одного столбца 120 / 3 = 40 пикселей. Если объект нашёлся по оси X в координатах от 0 до 40 значит он в первом столбце, от 40 до 80 во втором, от 80 до 120 в третьем. По Y тоже самое. |
|
|
|