Кибор » Кибор - Интегрированная среда разработки ботов » Готовые скрипты » Аналог функции findimage() через dll

Страниц (2): [1] 2 »
 

1. Skycrew - 11 Ноября, 2019 - 15:12:33 - перейти к сообщению
В соавторстве с Zireael, который помог разобраться с цветами, замутил такой скриптик.

К сожалению, запрет поиска в области, где было уже найдено по-красоте сделать не получилось. Может будут у кого идеи?

Мне же в голову приходит только "закрашивание" пикселей найденной области в массиве где ищем, однако это не позволит нам дальше нормально искать в этом-же массиве, что-то другое, не захватив снова экран, а это доп-время. Как вариант можно использовать вспомогательный массив копировать из первого в него и в нем уже искать и после закрашивать - как по мне корявое решение, к тому-же существенно увеличивает время поиска(

И еще мой вариант ищет по заданному разбросу сразу всех компонент цвета в обе стороны, но это можно добавить если будет нужно.

В целом-же dll-ка работает весьма быстро, что не может не радовать. Вот бы еще ускорить захват с экран каким-нибудь аналогом функции screen () - было бы вообще огонь! =)

Код DLL (C++):

CODE:
#include <iostream>

using namespace std;

extern "C" __declspec(dllexport) int FindIMG(int Колво, int Фон, int* ГдеИскать, int* Искомое, int* x, int* y, int ОбрШир, int ОбрВыс, int ЭкрШир, int ЭкрВыс, int Разброс)
{
int kol = ЭкрШир * ЭкрВыс, kol2 = ОбрШир * ОбрВыс; // Длины, разложенных в 1-мерные массивов ГдеИскать[] и Искомое[]
int i, ii, Индекс, Найдено = 0, Начало = 0, КраОбраз, ЗелОбраз, СинОбраз;

// Пропускаем пиксели в начале искомого изображения, если они = цвет фона
for (Начало = 0; Начало < kol2; Начало++)
{
if (Искомое[Начало] != Фон) break;
}

// Опредеяем компоненты первого пикселя искомого изображения
КраОбраз = Искомое[Начало] & 255;
ЗелОбраз = (Искомое[Начало] >> 8) & 255;
СинОбраз = Искомое[Начало] >> 16;

// Прогоняем по всему массиву ГдеИскать[] чтоб найти совпадение первого пикселя
for (i = 0; i < kol; i++)
{
if ( (ГдеИскать[i] & 255) >= КраОбраз - Разброс && (ГдеИскать[i] & 255) <= КраОбраз + Разброс &&
((ГдеИскать[i] >> 8) & 255) >= ЗелОбраз - Разброс && ((ГдеИскать[i] >> 8) & 255) <= ЗелОбраз + Разброс &&
(ГдеИскать[i] >> 16) >= СинОбраз - Разброс && (ГдеИскать[i] >> 16) <= СинОбраз + Разброс) //)
{
// Найдя первый пиксель, прогоняем уже по массиву Искомое[], чтобы установить совпадение всех его пикселей
for (ii = Начало; ii < kol2; ii++)
{
// Вычисляем место в 1-мерном массиве ГдеИскать[] которое соответствует месту Искомое[ii]
Индекс = i + (ii / ОбрВыс) * ЭкрВыс + ii % ОбрВыс;

if ( Фон != Искомое[ii] && ((ГдеИскать[Индекс] & 255) < (Искомое[ii] & 255) - Разброс || (ГдеИскать[Индекс] & 255) > (Искомое[ii] & 255) + Разброс ||
((ГдеИскать[Индекс] >> 8) & 255) < ((Искомое[ii] >> 8) & 255) - Разброс || ((ГдеИскать[Индекс] >> 8) & 255) > ((Искомое[ii] >> 8) & 255) + Разброс ||
(ГдеИскать[Индекс] >> 16) < (Искомое[ii] >> 16) - Разброс || (ГдеИскать[Индекс] >> 16) > (Искомое[ii] >> 16) + Разброс))
{
break;
}
}

// Опредляем, что в цикле выше совпали все пиксели массива Искомое[]
if (ii == kol2)
{
// "Закрасим" зону где было найдено цветом "-1", если мы не хотим больше искать в той-же области
// for (ii = 0; ii < kol2; ii++) //
// {
// Индекс = i + (ii / ОбрВыс) * ЭкрВыс + ii % ОбрВыс;
// ГдеИскать[Индекс] = -1;
// }

// Закидываем координаты найденого фрагмента в массивы x[] и y[]
x[Найдено] = i / ЭкрВыс;
y[Найдено] = i % ЭкрВыс;
Найдено++;
}

// и продолжаем цикл по массиву ГдеИскать[] с того места, где остановились ранее
// пока не пробежим весь массив или не упремся в ограничение:
if (Найдено == Колво) return Найдено;
}
}
return Найдено;
}


Код Кибора:

CODE:
external(INT, "FindIMG", "FindIMG", "Project7.dll");

int x[99], y[99], Кол, ОбрШир = 5, ОбрВыс = 5, time, ОбщВрем = 0;
int Экр[2560][1440], ЭкрШир = 2560, ЭкрВыс = 1440; // Указываем разрешение монитора

int Искомое[5][5]; loadimage (#Искомое[0][0], "Искомое.bmp");

screen (#Экр[0][0], 0, 0, 2560, 1440, -1);

loop(1) // Можно повторить поиск несколько раз, чтобы лучше сравнить разницу
{
time = gettime();

Кол = FindIMG(1, 0, address(#Экр[0][0]), address(#Искомое[0][0]), address(#x[0]), address(#y[0]), ОбрШир, ОбрВыс, ЭкрШир, ЭкрВыс, 15);
//Кол = findimage(1, #Искомое[0][0], 0, #x[0], #y[0], 0, 0, 2560, 1440, 15,15,15,15,15,15, 100, 1, #Экр[0][0]); // Поиск средствами Кибор для сравнения

if(Кол > 0) { ОбщВрем = ОбщВрем + (gettime() - time); pause(500); }
else { messagebox("Не нашёл"); close(); }
}

messagebox("Найдено: "+format(Кол)+" за время: "+format(ОбщВрем)+" мс.");

// Подвигать мышкой по найденым местам, если нужно
// pause(999); for(int i=0;i<Кол;i++) { mousemove(x[i], y[i]); pause(999); }
2. ivantu - 11 Ноября, 2019 - 16:08:43 - перейти к сообщению
Отличная работа! Танцующая корова
3. Zireael - 11 Ноября, 2019 - 16:55:25 - перейти к сообщению
 Цитата:
Вот бы еще ускорить захват с экран

Разве что разработчики винды что-нибудь придумают.
Быстрее захват не с экрана, а с окна.
4. Skycrew - 12 Ноября, 2019 - 03:47:47 - перейти к сообщению
 Zireael пишет:
 Цитата:
Вот бы еще ускорить захват с экран

Разве что разработчики винды что-нибудь придумают.
Быстрее захват не с экрана, а с окна.


Может быть, ну там в любом случае 50-100 мс получается только один захват занимает у меня(
Проявляется когда много всего нужно захватить, хочется побыстрее...
5. ivantu - 28 Декабря, 2021 - 00:40:43 - перейти к сообщению
Подскажите зачем :
// "Закрасим" зону где было найдено цветом "-1", если мы не хотим больше искать в той-же области

Если :

// и продолжаем цикл по массиву ГдеИскать[] с того места, где остановились ранее
// пока не пробежим весь массив или не упремся в ограничение:

Мы же не попадаем в то место где уже нашли, поиск продолжается с последнего места где было совпадение, или я чего то не понимаю...
6. Zireael - 28 Декабря, 2021 - 02:57:03 - перейти к сообщению
 Цитата:
Подскажите зачем :
// "Закрасим" зону где было найдено цветом "-1", если мы не хотим больше искать в той-же области

Допустим:
Искомая картинка размером 4*4 все пиксели чёрного цвета.
Ищем на картинке размером 5*5 все пиксели чёрного цвета.
Будет найдено 4 картинки в координатах:
0, 0
0, 1
1, 0
1, 1

Это можно проверить в findimage кибор. Если предпоследний параметр 1, то найдёт одну картинку, если 0, то четыре.
7. ivantu - 28 Декабря, 2021 - 05:04:42 - перейти к сообщению
Как все сложно.. Огорчение
8. KevinS - 05 Сентября, 2023 - 07:02:23 - перейти к сообщению
Есть у кого дописанная dll? с разбежностью цветов в обе стороны и возможностью указать кол-во разбежности для каждого канала цвета... Как в Кибор. Мне пришлось отказаться от использования Кибор, античит EAC банит в Rage MP проектах.
9. Kibor - 06 Сентября, 2023 - 10:40:21 - перейти к сообщению
KevinS ,
Где скачать и в чем выражается бан?
Вылет игры есть или просто бан?
10. KevinS - 07 Сентября, 2023 - 13:25:21 - перейти к сообщению
 Kibor пишет:
KevinS ,
Где скачать и в чем выражается бан?
Вылет игры есть или просто бан?



GTA5RP, это типо сампа, только в gta5.

Лаунчер(для просмотра ссылки Вам необходимо авторизоваться)
Можно подключиться к любому серверу, если Кибор открыт - прилетит бан. Патчер и т.п. не помогает. Бан выдается на всю платформу RAGE Multiplayer по копии игры...

У них стоит ЕАС, Кибор в черный список занесен.

Скрин бана:(для просмотра ссылки Вам необходимо авторизоваться)

Powered by ExBB FM 1.0 Final