Что нового

[Математика] Распознавание контура

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
Интересует способ распознавания контура треугольника.
Есть радар, на нем в центре мы - треугольник. Данный треугольник на радаре может поворачиваться когда мы двигаемся. Для определения углов нужно понять как он повернулся.

Особо идей пока нет, разве что групповой PixelSearch конца и начала треугольника, с замером дистанции между найденными пикселями и в дальнейшем перерасчет в углы поворота. Читал что есть вроде как OpenСV для распознавания, но материала для autoit толком не нашел. В целом распознавание по контуру пригодилось бы не только в этом - самом простом случае, где я могу выкрутиться)

Второй пример - есть объект, который может приближаться и отдаляться на экране. Как его можно распознать? PixelSearch не проходит, если объект более-менее разноцветный (а он, увы, такой).

Интересуют материалы поиска по контуру у кого что есть, именно с точки зрения математики + готовых библиотек, которые можно будет связать с autoit, сам я писать буду долго(если вообще напишу - геометрия - не моё, а инвариантные преобразования :stars:smile:, задачка не тривиальная. :whistle:
 

Александр_

[url=http://autoit-script.ru/index.php?topic=21393
Сообщения
62
Репутация
2
Доброго времени суток! как я вижу решение этой проблемы
1. Ищем в области на карте точки с похожим набором цветов
2. записываем координаты точек в массив
3. Дальше идет чисто линейная алгерба определение углов через координаты точек и тд.

Что касается объекта, то возможно надо отслеживать область экрана вне объекта на изменение цветовой гаммы. т.е определять где объект отслеживая координаты где он может появиться
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
Александр_ сказал(а):
Доброго времени суток! как я вижу решение этой проблемы...

Доброго! Благодарю за интерес к теме)

С точки зрения радара и треугольника - да, я пришел к тому же выводу. Достаточно взять 2 точки - центр треугольника(он неподвижен) и его вершину(или близкую к вершине точку). Далее как Вы и сказали - алгебра и геометрия, определение углов между отрезками, у которых одинаковая начальная точка - с этим справиться можно. :ok:

Очень интересная идея с гаммой, но тут две проблемы:
1) Запись сотни пикселей - мелочь, объект я записать могу, но фон... Там будет очень много цветов, в реальное время уложиться невозможно, на одно сканирование уйдет порядка нескольких минут, если работать pixelsearch, возможно через скриншот будет побыстрее.
2) Предположим 1-я проблема решена каким-либо способом. Почему я говорил о контуре? Да потому что картинка то не статичная, камеру мы можем повернуть, а как самый простой вариант - персонаж отошел на два шага вправо. Картинка изменилась, даже фон.
Кроме того - мне нужен конкретный объект. Как пример - есть 3 пирамиды и куб. Все они могут менять размеры(кроме одной пирамиды - пусть она статичная), но куб, когда он на том же расстоянии от нас что и пирамиды - в 2 раза больше чем они. Задача - определить дистанцию до куба =), можно даже полагаясь на неподвижную пирамиду.
Пока для решения такой задачи ничего лучше контуров в голову не приходило. Не забываем что это всё у нас разноцветное к тому же и двигается постоянно, а значит алгоритм не должен работать более 5-ти секунд. :scratch:
Нужны или идеи воплощения или идеи написания алгоритма контуров под AutoIt) Ну или просто формулы для контуров. Толком по этой теме не нашел ничего, алгоритмы есть, но без нормальных примеров или какие-то кусочные. :-X

Дистанция до статичной пирамиды, скажем 5 метров. Соответственно по ней и будем ориентироваться.
Небольшое пояснение:
635775e03034.png
 

Александр_

[url=http://autoit-script.ru/index.php?topic=21393
Сообщения
62
Репутация
2
1. На счет обработки фона определенно будет лучше работать через скрин экрана, если хорошо поискать, то на это же отличном форуме можно найти выполнения автошота современную на стрелялку. В этом автошоте реч шла про использование скрина экрана и последующей его обработке.
2. Что касается использование контуров, то варианты есть еще более интересные
- Самое простое читать миникарту так же по цвету (если есть возможность)
- В свое время натыкался на статейку что координаты объектов можно выкружить из памяти процесса, но как это сделать не в курсе
- Еще вроде как можно узнавать координаты объекта это использовать драйвера видеокарты, т.е считывать не из памяти процесса игры, а из координат которые прорисовывает видеокарта.
- ну и совсем дикая идея это сделать массив из 1 и 0. 1- стенка 0- пустота (идти в сторону Х, У количества секунд). и описать карту в игре через 1 и 0. :IL_AutoIt_1:
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
Александр_ сказал(а):
2. Что касается использование контуров, то варианты есть еще более интересные...

1. Да, находил, но пока необходимости работать через скриншоты не было - не знаю как уж там со скоростью чтения и сравнения пикселей.

2. Нет, с мини картой, все понятно ;) Для неё извращения с контурами не нужны :rofl:
Контуры появляются когда мне надо определить что ко мне идёт большой и нехороший моб, который меня стукнет и ппц :-X При этом остальные бегающие меня не волнуют.

Можно выкрутить из памяти, знаю. Принципиально не работаю с памятью - её можно отследить, причем я не настолько хорошо представляю с каких сторон чтобы защититься заранее. Концепция максимального невмешательства в клиент. Я даже щелчки мыши шлю в глобальных координатах. Про её движение уж умолчу :whistle: Оно относительно усложненное.

Идея интересная, надо покопать в сторону видеокарты. Догадываюсь что там тоже не всё так просто, но глянуть можно, хотя скорее всего идея не пройдет - видеокарта рисует те же пиксели, у нее нет понятие "объект" и "трехмерные координаты", а значит новой информации от неё я не получу...

Ну идея не такая дикая, как кажется, но в моем случае не пройдет - это 3d, а не вид сверху) Тогда бы у меня и объекты не увеличивались) Но идея тоже интересная, может что придумаю в эту сторону :scratch:


PS. Пока писал появилась еще идея - записать несколько пикселей с областями от большого моба, когда он лицом к нам, скажем 3 шт. Искать хотя бы 1 относительно похожий пиксель из любой из 3-х областей. Если он найден(например нижний пиксель) - от него в нужные стороны провести проверки на наличие похожих на какие либо пиксели из 2-х областей сверху. При определенном количестве совпадений - делаем вывод что это моб.
Таки даже человек вплотную не поймет что за объект перед ним, так же у нас ограничена и дальность зрения. Данный алгоритм так же будет работать до некоторой степени приближения или удаления моба. осталось запрогать и потестить. тема не решена - это только одна из идей. :whistle:
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
GreyWerewolf сказал(а):
Принципиально не работаю с памятью - её можно отследить, причем я не настолько хорошо представляю с каких сторон чтобы защититься заранее. Концепция максимального невмешательства в клиент.
Порой тоже копаюсь в памяти игр. Хотелось бы знать, как можно отследить считывание из памяти процесса? Есть какая-то возможность отследить, что к процессу подцепилась стороняя программа? Просто по мне так это самый простой способ. Можно определить какой моб и на каком расстоянии.
Правда всё это при условии, что не стоит защита.
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
edyapd сказал(а):
Порой тоже копаюсь в памяти игр...

OffTopic:

Сказал же, что особо тему обхода защит не изучал...
Немного ответов есть тут:
OffTopic:
bbs.vbstreets.ru/viewtopic.php?f=1&t=43189

OffTopic:
sql.ru/forum/740472/otsledit-popytki-chteniya-dannyh-iz-pamyati-drugih-prilozheniy

"Есть способ контролировать необходимый регион памяти - трассировать программу, проверяя, не обращается ли очередная команда к охраняемому диапазону, если да - генерировать исключение." - цитата из "Фундаментальные основы хакерства. Искусство дизассемблирования", автор Крис Касперски. Там же есть еще пара примеров.

Просьба не оффтопить :-X
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
GreyWerewolf
Раз вы такой параноик, то оффтопить придется, как же иначе? :smile:


1. Касательно SEH можете не напрягаться, это слишком медлительно и годится только для локальных обращений(при условии, что память SEH'ом не шифруется). Разработчики никогда не применяют подобные методы в геймдеве, это не оправдывает даже половины проблем.

2. С перехватом Nt* функций все несколько неоднозначно, зависит от того, каким образом был установлен перехват:
2-а) Драйвер:
2-а-1) SSDT. Не актуально для x64 и нелегально, разработчики не применяют этот метод.
2-а-2) Inline. Также не актуально для x64 и нелегально, разработчики не применяют этот метод.
2-б) Юзермод:
2-б-1) Грузить свой модуль во все процессы >> Inline. Легко обходится. Как бы это смешно не звучало, но до этого некоторые опускаются.

3. Прочие методы (в том числе документированные):
3-а) Драйвер:
3-а-1) ObRegisterCallbacks. Реагирует на создание хэндла необходимого для чтения процесса, используется для ограничения прав.

Стоит еще упомянуть о возможности "перечисления" хэндлов, если среди них цель - игровой процесс, то стоит присмотреться к его владельцу.

Пожалуй все, что вам нужно знать. Я помогу с выводом:
Боязнь работы с классом отладочных функций и параллельное использование эмуляции/снятия скриншотов - как минимум бессмысленно и смешно, если речь идет о методах защиты присутствующего античита. Намного проще отследить эмуляцию мыши, чем прикрывать все отладочные(и прочие) дыры.

Убедитесь, что игра не пихает драйвер в систему и можете смело читать память процесса.


P.S. Касательно "нелегально" - мелкософты не одобряют нарушения целостности ядра, поэтому официальные разработчики не применяют подобные методы, а на x64 это и вовсе невозможно (PatchGuard).
 
Автор
GreyWerewolf

GreyWerewolf

То тут, то там...
Сообщения
23
Репутация
0
firex сказал(а):
GreyWerewolf
Раз вы такой параноик, то оффтопить придется, как же иначе? :smile:

OffTopic:
За инфу спасибо, познавательно)
Как можно узнать что мышь эмулированна программно кроме флага Injected? Кстати, как оффтоп - было бы интересно узнать о способах его убирания на AutoIt, если такие есть) Правда пишут, что этот флаг так же законно используют сторонние программы, поэтому за ним, как правило, не следят.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
GreyWerewolf
Отошли мы с вами несколько от темы, спишем это на альтернативные методы распознавания вашего контура.

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

было бы интересно узнать о способах его убирания на AutoIt
Как вариант можно зарегистрировать свой LowLevel, он автоматически станет в начало цепочки хуков, в нем ловить наши нажатия и подтирать флаг, затем CallNextHookEx. Кстати, есть некоторая проблема: защита может ставить свой хук после нашего(таким образом он станет выше), либо "поднимать" через случайные промежутки времени. Для такого сценария могу предложить следующее:
Есть недокументированная структура tagSHAREDINFO, присутствует она во всех GUI-процессах. Подробнее можете почитать тут: http://www.wasm.ru/article/501
Следим за тем, что бы наш хук был постоянно первым, если стали выше - поднимаемся.

Надеюсь ничего не забыл. :smile:
 
Верх