Узнайте, как захватывать данные окна в режиме реального времени в виде видеопотока для обработки в OpenCV. Мы попробуем несколько различных методов в поисках наиболее быстрого. В этом руководстве я также расскажу о важности хороших навыков поиска в Google для программистов, а также повторю некоторые базовые концепции объектно-ориентированного программирования.
Полный плейлист с руководством: • OpenCV Object Detection in Games
Скачать код на GitHub: https://github.com/learncodebygaming/...
Обсуждаемое исследование:
Видео о начале работы с OpenCV: https://docs.opencv.org/4.2.0/dd/d43/...
Самый быстрый способ сделать снимок экрана с помощью Python в Windows: https://stackoverflow.com/a/3586280/1...
Конвертация изображения PyAutoGUI в OpenCV: https://stackoverflow.com/q/32918978/...
Вместо этого конвертируйте SaveBitmapFile в изображение OpenCV: https://stackoverflow.com/q/41785831/...
Лучший справочник по Numpy: https://numpy.org/doc/1.18/user/quick...
Список всех окон: https://stackoverflow.com/q/55547940/...
0:47 Основной цикл захвата
3:16 Использование PyAutoGUI screenshot()
6:24 Измерение частоты кадров (FPS)
8:27 Использование Pillow ImageGrab
9:31 Использование Pywin32 для создания скриншотов
13:48 Преобразование win32ui.CreateBitmap() для OpenCV
17:23 Ограничение скриншотов конкретным окном
18:42 Создание класса WindowCapture
25:05 Обрезка захвата окна
28:15 Преобразование изображения в положение на экране
29:35 Заключение
Полное руководство с примерами кода можно прочитать здесь: https://learncodebygaming.com/blog/fa...
До этого момента мы использовали OpenCV для обнаружения объектов на статических изображениях. Теперь мы готовы применить эти же методы к видеоиграм в реальном времени.
Помните, что видео — это всего лишь серия статичных изображений, отображаемых в быстрой последовательности. В этом руководстве наша цель — делать снимки экрана как можно быстрее и отображать их в окне OpenCV, чтобы получить видеопоток интересующей нас игры в реальном времени. Это подготовит нас к обработке данных изображений в OpenCV в реальном времени.
В OpenCV есть руководство «Начало работы с видео», которое послужит основой для нашего кода. Наше руководство отличается от официального руководства только тем, что мы готовимся работать со снимками экрана, а не с кадрами с камеры.
При определении функции get_screenshot() вы можете просто использовать pyautogui.screenshot() из библиотеки PyAutoGUI или ImageGrab.grab() из библиотеки изображений Python.
И это сработает, но прямой вызов API Windows имеет несколько преимуществ. Во-первых, мы приближаемся к теоретическому пределу скорости создания снимков экрана, взаимодействуя непосредственно с операционной системой. Во-вторых, в API Windows есть методы, которые позволят нам получать данные экрана только для интересующего нас окна, даже если оно свёрнуто или находится вне экрана.
Для этого сначала нужно выполнить команду pip install pywin32, чтобы получить доступ к API Win32 в Python.
Начнём с кода, который сделает снимок всего рабочего стола и сохранит его в файл. Это подтвердит работоспособность вызовов API Windows. Вызов этой функции должен привести к созданию файла снимка экрана debug.bmp.
Следующий шаг — изменить эту функцию так, чтобы вместо сохранения изображения она возвращала данные изображения, отформатированные для работы с OpenCV.
Теперь мы можем вызвать эту функцию из нашего исходного бесконечного цикла и получить потоковое изображение рабочего стола в реальном времени.
Чтобы улучшить этот результат, можно использовать win32gui.FindWindow(None, window_name) для захвата только нужного окна. Замените window_name строкой, содержащей имя из заголовка окна, которое нужно захватить. Это позволит захватывать кадры этого окна, даже если оно скрыто за другими окнами.
Если вам сложно определить имя нужного окна, используйте этот код для вывода списка имён всех существующих окон:
Мы можем ещё больше улучшить наш код, обрезав лишнее вокруг нужного окна. При запуске приведённого выше кода вы заметите чёрное пространство справа и снизу от изображения окна, а также границы и заголовок окна. Их удаление не только улучшит внешний вид, но и повысит частоту кадров. Мы также можем добиться улучшения, не вызывая win32gui.FindWindow() при каждом вызове get_screenshot(), поэтому давайте создадим для этого класс.
Наконец, нам понадобится способ преобразовать позиции, обнаруженные на скриншотах, обратно в позиции в пикселях на реальном мониторе. В конструкторе класса WindowCapture я уже включил код для вычисления смещения окна, используя данные о его положении из win32gui.GetWindowRect(). Давайте добавим в наш класс метод, который использует это смещение для возврата преобразованной позиции на экране.
Продолжить чтение письменного руководства можно здесь: https://learncodebygaming.com/blog/fa...
Информация по комментариям в разработке