如何将我的显示器的输出用作程序的input?

一些背景:我希望能够制作一个可以根据视觉input进行video游戏的程序。 当游戏在屏幕上时,我可以直接在显示器上指定一个networking摄像头,但是我宁愿只是通过某种方式将屏幕上的任何像素信息发送到我的程序。

具体来说,我希望以30fps的速度截图并计算它们。 到目前为止,我唯一能想到的就是当我的程序“按下”某个键时,使用Fraps截取屏幕截图,但是这些只能以每秒一个的最大速率进行,并且需要使用这个外部程序。 我希望有更直接的截取这个屏幕信息的方法。

我目前正在计划使用Java和Matlab的组合,但我很乐意切换到任何语言有一个很好的方式来抓住截图迅速。 噢,我在Windows 7上这样做,以防这种抓屏操作的低级别足够重要。

如果是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应用程序发送游戏视图一样)。

我会刺探回答你的问题。 基本的答案是屏幕数据本身是内存映射的,所以它驻留在物理内存的某个地方。 但是,您的操作系统可能会阻止您直接通过其虚拟内存系统访问该内存。 所以,获得访问权的唯一方法是:

a)编写一个设备驱动程序来访问它;或者b)使用其他人编写的设备驱动程序来访问它

在Windows上,您可以使用DirectX访问屏幕数据。 这个网站解释了如何做到这一点:

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

你可以做到这一点,但复杂的图像处理,手势识别和机器学习算法。 如果你想赢得这个自然让你的研究复杂的游戏,那么系统的响应应该是实时的。

但是,如果原始游戏是由您自己开发的,那么您可能不需要任何图像处理,摄像头和FRAPS。 在这种情况下,所有你需要的是机器学习游戏。