1 (изменено: evilhero, 2018-01-12 14:46:46)

Тема: AHK: Определение координат игрока путем анализа изображения.

Добрый день! Решаю задачу по определению местоположения персонажа в игре путем анализа изображения миникарты. Прошу помощи сообщества в определении и разработки надежного и быстрого алгоритма, работающего в режиме реального времени.

Я лишь частично приблизился к решению этой задачи путем сохранения в ТЕКСТОВЫЙ файл цветов последовательности пикселей на миникарте, т.е. создавал текстовую карту цветов. Далее я пытался в игре считать цвет строки пикселей и искал в файле номер строки и положение курсора при успешном поиске по файлу.  Здесь я натянулся на ограничение в скорости передвижения, ведь когда игрок двигается слишком быстро при сканировании цвета строки пикселей, часть строки смещается и поиск по файлу результатов не дает .


На данный момент у меня есть несколько вариантов алгоритма, которые должны помочь в решении задачи:
А) идеальный вариант
1. отснять всю миникарту области, по которой перемещается игрок
2. получить часть изображения миникарты в игре online
3. найти кусочек миникарты п.2 на изображении п.1 и определить координаты

Б)приемлемый вариант
1. начинать движение в определенной точке игрового мира
2. делать снимок участка миникары
3. делать второй снимок после небольшой задержки и определять смещение
4. изменять координаты по смещению

Главной трудностью для меня стала работа функции ImageSearch, ведь она ищет изображение из файла на экране, а мне надо наоборот,искать изображение с экрана в файле. Или я неправильно рассуждаю ?

2 (изменено: stealzy, 2018-01-12 17:36:47)

Re: AHK: Определение координат игрока путем анализа изображения.

Все возможно, даже можно создать(собрать) изображение всей карты и искать в нем кусочек миникарты, так вы сразу получите точные абсолютные координаты.
Ключевой вопрос будет скорость выполнения.
• Запись и чтение из файла - избавиться в первую очередь, вроде ImageSearch может принимать bitmap из памяти (loaded from memory).
• ImageSearch не самый быстрый, есть функции альтернативы. Из интересных попробуйте FindText(), он обрабатывает изображение в ч/б паттерн, для вас это может быть плюс, а может минус.
Возможен другой подход: анализировать небольшой участок попиксельно, скажем 3х3 пикселя можно до ≈1000 раз/сек.

Window_CreateCapture(hwnd) {
	Return DllCall("user32.dll\GetDCEx", "UInt", hwnd, "UInt", 0, "UInt", 1|2|8|16)
}
GetPixel(hDC, x, y) {
	DllCall("gdi32.dll\GetPixel", "UInt", hDC, "Int", x, "Int", y, "UInt")
}
Window_DeleteCapture(hwnd, hDC) {
	DllCall("user32.dll\ReleaseDC", "UInt", hwnd, "UInt", hDC)
}
Hex := Format("0x{:x}", GetPixel(hDC, x, y))