Всем доброго времени суток.
У меня возник вопрос по поводу поиска изображений. Точнее сказать по поводу анализа изображения.
функция FindImage помогает найти картинку на экране, но мне нужно немножко другое.
В одном и том же месте на экране показывается случайная из 300 картинок 50х50 пикселей. Картинки делятся на 2 категории.
Задача состоит в том, чтоб определить к какой из двух категорий относится картинка.
На данный момент я думаю сделать это с помощью FindImage. Искать последовательно каждую картинку из Категории№1 в выбранной зоне, если найдет значит это Категория№1, если нет соответственно Категория№2. Но думаю такой способ не будет быстрым в работе.
Существует ли способ сделать это по-другому?
Заранее благодарю за ваши идеи и советы.
1. tyyty77 - 11 Октября, 2023 - 09:41:41 - перейти к сообщению
2. resident - 11 Октября, 2023 - 13:18:04 - перейти к сообщению
Если одно и то же место, то обозначив область поиска в 50х50 от картинки будет сравниваться по одному пикселю, если не совпало, то будет проверяться следующая картинка. Вполне себе быстро.
3. Kibor - 11 Октября, 2023 - 19:59:24 - перейти к сообщению
tyyty77 пишет:
Искать последовательно каждую картинку из Категории№1 в выбранной зоне, если найдет значит это Категория№1, если нет соответственно Категория№2. Но думаю такой способ не будет быстрым в работе.
Достаточно быстрый. Но не достаточно надежный.
А если там вообще не будет никакой категории? От подумает что вторая.
Искать надо все.
Ищите и ту и ту. 2 цикл делайте.
Искать надо по заранее сделанному скриншоту.
По экрану будет долго, так как каждый раз будет делаться новый снимок.
Поиск 300 разных картинок 50 на 50 в зоне 70 на 70 занимает у меня 80 мс. Можно разбить на 2 цикла с поиском по 150 (разные категории)
CODE:
/*
//Создаем 300 картинок для теста
int Image[300][50][50];
loadimage (#Image[0][0][0], "D:\Image_0.bmp");//Изображение 50 на 50
for (int n=0; n<300; n++)
{
saveimage(#Image[0][0][0], "D:\t\Image_"+format(n)+".bmp");//Копируем его 300 раз, для теста
}
*/
int Image[300][50][50];
for (int n=0; n<300; n++)
{
loadimage (#Image[n][0][0], "D:\t\Image_"+format(n)+".bmp");//Загружаем наши 300 картинок (Они должны быть разные. Это тест)
}
int PosX, PosY;
int ZonaX1=100, ZonaY1=500, ZonaX2=170, ZonaY2=570;
int SCREEN[70][70];
int time=gettime();
screen (#SCREEN[0][0], ZonaX1, ZonaY1, ZonaX2, ZonaY2, -1);//Делаем скрин зоны в которой ищем. 70 на 70
for (n=0; n<300; n++)
{
findimage(1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, #SCREEN[0][0]);
}
messagebox (gettime()-time);
//Создаем 300 картинок для теста
int Image[300][50][50];
loadimage (#Image[0][0][0], "D:\Image_0.bmp");//Изображение 50 на 50
for (int n=0; n<300; n++)
{
saveimage(#Image[0][0][0], "D:\t\Image_"+format(n)+".bmp");//Копируем его 300 раз, для теста
}
*/
int Image[300][50][50];
for (int n=0; n<300; n++)
{
loadimage (#Image[n][0][0], "D:\t\Image_"+format(n)+".bmp");//Загружаем наши 300 картинок (Они должны быть разные. Это тест)
}
int PosX, PosY;
int ZonaX1=100, ZonaY1=500, ZonaX2=170, ZonaY2=570;
int SCREEN[70][70];
int time=gettime();
screen (#SCREEN[0][0], ZonaX1, ZonaY1, ZonaX2, ZonaY2, -1);//Делаем скрин зоны в которой ищем. 70 на 70
for (n=0; n<300; n++)
{
findimage(1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, #SCREEN[0][0]);
}
messagebox (gettime()-time);
Поиск 300 разных картинок 50 на 50, с разбежностью цвета 20, в зоне 70 на 70 занимает у меня 150 мс. При условие включения быстрого поиска -(для просмотра ссылки Вам необходимо авторизоваться)
CODE:
/*
//Создаем 300 картинок для теста
int Image[300][50][50];
loadimage (#Image[0][0][0], "D:\Image_0.bmp");//Изображение 50 на 50
for (int n=0; n<300; n++)
{
saveimage(#Image[0][0][0], "D:\t\Image_"+format(n)+".bmp");//Копируем его 300 раз
}
*/
int Image[300][50][50];
for (int n=0; n<300; n++)
{
loadimage (#Image[n][0][0], "D:\t\Image_"+format(n)+".bmp");
}
int PosX, PosY;
int ZonaX1=100, ZonaY1=500, ZonaX2=170, ZonaY2=570;
int SCREEN[70][70];
int r=20;
int p=100;
int time=gettime();
screen (#SCREEN[0][0], ZonaX1, ZonaY1, ZonaX2, ZonaY2, -1);//Делаем скрин зоны в которой ищем. 70 на 70
for (n=0; n<300; n++)
{
findimage (SWIFT, 1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, r, r, r, r, r, r, p, 1, #SCREEN[0][0]);
}
messagebox (gettime()-time);
//Создаем 300 картинок для теста
int Image[300][50][50];
loadimage (#Image[0][0][0], "D:\Image_0.bmp");//Изображение 50 на 50
for (int n=0; n<300; n++)
{
saveimage(#Image[0][0][0], "D:\t\Image_"+format(n)+".bmp");//Копируем его 300 раз
}
*/
int Image[300][50][50];
for (int n=0; n<300; n++)
{
loadimage (#Image[n][0][0], "D:\t\Image_"+format(n)+".bmp");
}
int PosX, PosY;
int ZonaX1=100, ZonaY1=500, ZonaX2=170, ZonaY2=570;
int SCREEN[70][70];
int r=20;
int p=100;
int time=gettime();
screen (#SCREEN[0][0], ZonaX1, ZonaY1, ZonaX2, ZonaY2, -1);//Делаем скрин зоны в которой ищем. 70 на 70
for (n=0; n<300; n++)
{
findimage (SWIFT, 1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, r, r, r, r, r, r, p, 1, #SCREEN[0][0]);
}
messagebox (gettime()-time);
Поиск 300 разных картинок 50 на 50 в зоне 600 на 300 занимает у меня 400 мс
Это уже не просто сравнение, а поиск координат в большой зоне.
CODE:
/*
//Создаем 300 картинок для теста
int Image[300][50][50];
loadimage (#Image[0][0][0], "D:\Image_0.bmp");//Изображение 50 на 50
for (int n=0; n<300; n++)
{
saveimage(#Image[0][0][0], "D:\t\Image_"+format(n)+".bmp");//Копируем его 300 раз, для теста
}
*/
int Image[300][50][50];
for (int n=0; n<300; n++)
{
loadimage (#Image[n][0][0], "D:\t\Image_"+format(n)+".bmp");//Загружаем наши 300 картинок (Они должны быть разные. Это тест)
}
int PosX, PosY;
int ZonaX1=100, ZonaY1=200, ZonaX2=700, ZonaY2=500;
int SCREEN[600][300];
int time=gettime();
screen (#SCREEN[0][0], ZonaX1, ZonaY1, ZonaX2, ZonaY2, -1);//Делаем скрин зоны в которой ищем. 600 на 300
for (n=0; n<300; n++)
{
findimage(1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, #SCREEN[0][0]);
}
messagebox (gettime()-time);
//Создаем 300 картинок для теста
int Image[300][50][50];
loadimage (#Image[0][0][0], "D:\Image_0.bmp");//Изображение 50 на 50
for (int n=0; n<300; n++)
{
saveimage(#Image[0][0][0], "D:\t\Image_"+format(n)+".bmp");//Копируем его 300 раз, для теста
}
*/
int Image[300][50][50];
for (int n=0; n<300; n++)
{
loadimage (#Image[n][0][0], "D:\t\Image_"+format(n)+".bmp");//Загружаем наши 300 картинок (Они должны быть разные. Это тест)
}
int PosX, PosY;
int ZonaX1=100, ZonaY1=200, ZonaX2=700, ZonaY2=500;
int SCREEN[600][300];
int time=gettime();
screen (#SCREEN[0][0], ZonaX1, ZonaY1, ZonaX2, ZonaY2, -1);//Делаем скрин зоны в которой ищем. 600 на 300
for (n=0; n<300; n++)
{
findimage(1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, #SCREEN[0][0]);
}
messagebox (gettime()-time);
4. GreatProgram - 17 Ноября, 2023 - 10:31:26 - перейти к сообщению
Здравствуйте! Работаю в визуальном редакторе,
будет ли конфликт в работе когда это дело скомпилируется в Киборе?
Я о функциях Findimage, loadimage, screen и т.д.
(Честно мне самому кажется этот вопрос глупым, и я знаю ответ,
но мне хочется быть уверенным, что конфликта не будет...
Так же вводит в ступор количество параметров в Findimage, например в киборе это может
выглядеть так:
а при анализе в Киборе, то что сгенерировал визуальный редактор:
А далее следует объявление function FindImage(с огромным количеством параметров){и телом...}
В общем это и вызывает в первую очередь недопонимание, что будет если я буду писать в визуальном редакторе в блоке кода код на поиск изображений, так же хотелось бы каждому изображению присвоить свою переменную для идентификации (найдено/не найдено)
Подскажите пожалуйста...
будет ли конфликт в работе когда это дело скомпилируется в Киборе?
Я о функциях Findimage, loadimage, screen и т.д.
(Честно мне самому кажется этот вопрос глупым, и я знаю ответ,
но мне хочется быть уверенным, что конфликта не будет...
Так же вводит в ступор количество параметров в Findimage, например в киборе это может
выглядеть так:
CODE:
findImage(1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, #SCREEN[0][0]);
а при анализе в Киборе, то что сгенерировал визуальный редактор:
CODE:
FindImage(1, #Screen[0][0], #W_Kib, W_Kib.leftclient, W_Kib.topclient, #Image0[0][0], 1, 0, 0, 0, #K_Kib, #X_Kib[0], #Y_Kib[0], 0, 0, eX_Kib, eY_Kib, 0, 0, -1, 0, 100, 0, 0, "0, 0, 0, 0", 0, "Бездействие", 0, 0, 0, 0, 5, 5, 0, 0);
А далее следует объявление function FindImage(с огромным количеством параметров){и телом...}
В общем это и вызывает в первую очередь недопонимание, что будет если я буду писать в визуальном редакторе в блоке кода код на поиск изображений, так же хотелось бы каждому изображению присвоить свою переменную для идентификации (найдено/не найдено)
Подскажите пожалуйста...
5. Kibor - 17 Ноября, 2023 - 10:43:38 - перейти к сообщению
Функции которые генерирует виз редактор, это не просто findimage. Это блок в котором содержится findimage и который выполняет много других задач, кроме поиска изображения.
Поэтому там столько параметров.
Конфликта не будет.
Поэтому там столько параметров.
Конфликта не будет.
6. GreatProgram - 18 Ноября, 2023 - 06:36:23 - перейти к сообщению
(Не обязательно к прочтению!) Не ругайте сильно меня что задаю этот вопрос не в той теме. Это кончено относиться к арифметическим операторам...
Как проверить четное число или нет? Не нашел тут оператор % да и булевых тоже нету...
(Добавление)
В общем я решил это так:
Как проверить четное число или нет? Не нашел тут оператор % да и булевых тоже нету...
(Добавление)
В общем я решил это так:
CODE:
int a=0, b;
double c;
b=3; //тут надо присвоить Ваше проверяемое число
a=b/2;
c=b/2;
if (a==c) messagebox ("Четное");
else messagebox ("Не четное");
double c;
b=3; //тут надо присвоить Ваше проверяемое число
a=b/2;
c=b/2;
if (a==c) messagebox ("Четное");
else messagebox ("Не четное");
7. Kibor - 18 Ноября, 2023 - 06:58:19 - перейти к сообщению
GreatProgram пишет:
Как проверить четное число или нет? Не нашел тут оператор % да и булевых тоже нету
и не надо они кликеру.
CODE:
messagebox (ch(8));
function ch(double a)
{
int b=a/2;
if (a==b*2) return 1;
return 0;
}
function ch(double a)
{
int b=a/2;
if (a==b*2) return 1;
return 0;
}
8. GreatProgram - 19 Ноября, 2023 - 04:35:44 - перейти к сообщению
findimage (SWIFT, 1, #Image[n][0][0], -1, #PosX, #PosY, 0, 0, ZonaX2-ZonaX1, ZonaY2-ZonaY1, r, r, r, r, r, r, p, 1, #SCREEN[0][0]);
Подскажите пожалуйста, что принимает этот параметр (Выделил красным)? И какие значения он может иметь.
Еще хотел узнать, если у меня не используются переменные PosX PosY. То что вместо них можно поставить может быть этот параметр имеет ключ какой либо, что бы не использовать их?
Подскажите пожалуйста, что принимает этот параметр (Выделил красным)? И какие значения он может иметь.
Еще хотел узнать, если у меня не используются переменные PosX PosY. То что вместо них можно поставить может быть этот параметр имеет ключ какой либо, что бы не использовать их?
9. Kibor - 19 Ноября, 2023 - 04:45:23 - перейти к сообщению
0 или 1
К примеру у вас большая разбежность оттенков и малый процент совпадения стоит. Тогда в месте где на самом деле находится 1 фрагмент будет найдено много, с небольшим смещением координат x y.
Если поставить 1, то в зоне где уже найдено одно изображение больше не будет искаться, даже если они подходят под параметры поиска.
Надо ставить 1.
(Добавление)
Там должны быть указатели на переменные типа int, куда запишутся координаты найденного фрагмента.
К примеру у вас большая разбежность оттенков и малый процент совпадения стоит. Тогда в месте где на самом деле находится 1 фрагмент будет найдено много, с небольшим смещением координат x y.
Если поставить 1, то в зоне где уже найдено одно изображение больше не будет искаться, даже если они подходят под параметры поиска.
Надо ставить 1.
(Добавление)
GreatProgram пишет:
Еще хотел узнать, если у меня не используются переменные PosX PosY. То что вместо них можно поставить может быть этот параметр имеет ключ какой либо, что бы не использовать их?
Там должны быть указатели на переменные типа int, куда запишутся координаты найденного фрагмента.
10. GreatProgram - 19 Ноября, 2023 - 04:53:50 - перейти к сообщению
С первым вопросом понял Вас. Спасибо.
А вот второй я так понимаю это обязательно, так как так написана функция и она не предусматривает работы по другому... Да про int знаю и указатель #, просто мне этот функционал не несет никакой практической пользы. Нет необходимости потом по этим координатам переносить мышь и т.д. В общем это вшитая фича в функцию?
А вот второй я так понимаю это обязательно, так как так написана функция и она не предусматривает работы по другому... Да про int знаю и указатель #, просто мне этот функционал не несет никакой практической пользы. Нет необходимости потом по этим координатам переносить мышь и т.д. В общем это вшитая фича в функцию?