Как я могу использовать вывод моего монитора в качестве входа в программу? - PullRequest
2 голосов
/ 30 июня 2011

Некоторый контекст: я надеюсь создать программу, способную воспроизводить видеоигру на основе визуального ввода. Хотя я мог бы просто направить веб-камеру на мой монитор, пока игра на экране, я бы предпочел просто иметь какой-либо способ отправлять любую информацию о пикселях, которая идет на экран, в мою программу.

В частности, я надеюсь сделать скриншоты со скоростью ~ 30 кадров в секунду и вычислить их. Пока что я могу думать только о том, чтобы использовать Fraps для создания снимков экрана, когда моя программа «нажимает» на определенную клавишу, но они могут быть сделаны с максимальной скоростью, равной одному в секунду, и требуют использования этой внешней программы. Я надеюсь, что есть какой-то способ перехватить эту информацию на экране более прямо.

В настоящее время я планирую использовать комбинацию Java и Matlab, но я был бы рад переключиться на тот язык, на котором есть хороший способ быстро делать скриншоты. О, и я делаю это на Windows 7, на случай, если эта операция захвата экрана достаточно низкоуровневая, чтобы это имело значение.

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Если это 2D-игра Java, вы просто отправляете ее в фрейм-буфер, а также в свою программу визуального ввода. Если это 3D и Java, вы могли бы сделать то же самое с функциями скриншотов в библиотеке, в которой написана игра. Если это игра в другом окне, вы можете попробовать использовать java.awt.Robot (http://download.oracle.com/javase/1,5.0/docs/api/java/awt/Robot.html) и посмотреть если функция скриншота работает. Вы получаете BufferedImage, который вы отправляете в программу визуального ввода (как если бы вы отправляли игровой вид из приложения Java 2D или 3D).

2 голосов
/ 30 июня 2011

Я попытаюсь ответить на ваш вопрос.Основной ответ заключается в том, что сами данные экрана отображаются в памяти, поэтому они находятся где-то в физической памяти.Однако ваша операционная система, вероятно, отключила вас от доступа к этой памяти напрямую через систему виртуальной памяти.Таким образом, единственный способ получить доступ - это:

a) Написать драйвер устройства для доступа к нему или b) Использовать драйвер устройства, написанный кем-то другим, для доступа к нему

В Windows выможет использовать DirectX для доступа к данным экрана.Этот сайт объясняет, как это сделать:

http://www.dgrigoriadis.net/post/2008/01/29/Taking-screenshots-with-DirectX-90.aspx

0 голосов
/ 30 июня 2011

Вы можете сделать это, но с помощью сложной обработки изображений, распознавания жестов и алгоритмов машинного обучения.И система должна реагировать в режиме реального времени, если вы хотите выиграть ту игру, которая естественным образом усложняет ваши исследования.

Но если оригинальная игра разработана вами, вам, вероятно, не понадобитсяобработка изображений, веб-камера и FRAPS.В этом случае все, что вам нужно, это машинное обучение для игры.

...