如何将监视器的输出用作程序的输入?

时间:2011-06-30 04:28:19

标签: java windows video-capture video-processing

某些背景:我希望制作一个可以根据视觉输入播放视频游戏的程序。虽然当游戏在屏幕上时,我可以在我的显示器上指向一个网络摄像头,但我更愿意将某些像素信息发送到我的程序中。

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

我目前正在计划使用Java和Matlab的组合,但我很乐意切换到哪种语言可以快速抓取屏幕截图。哦,我在Windows 7上这样做,以防这个屏幕抓取操作的水平低到足以让它重要。

3 个答案:

答案 0 :(得分:2)

如果它是2D Java游戏,您只需将其发送到帧缓冲区以及视觉输入程序。如果它是3D和Java,您可能会在编写游戏的库中执行类似的截图功能。如果它是另一个窗口中的游戏,您可以尝试使用java.awt.Robothttp://download.oracle.com/javase/1,5.0/docs/api/java/awt/Robot.html)并查看屏幕截图功能是否有效。你得到一个BufferedImage,你会发送到视觉输入程序(就像你从Java 2D或3D应用程序发送游戏视图一样)。

答案 1 :(得分:2)

我会抓住你回答你的问题。基本答案是屏幕数据本身是内存映射的,因此它驻留在物理内存中的某个位置。但是,您的操作系统可能会阻止您直接通过其虚拟内存系统访问该内存。因此,获取访问权限的唯一方法是:

a)编写设备驱动程序以访问它 要么 b)使用其他人编写的设备驱动程序访问它

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

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

答案 2 :(得分:0)

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

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