【问题标题】:How can I use the output of my monitor as the input to a program?如何将显示器的输出用作程序的输入?
【发布时间】:2011-09-25 16:11:37
【问题描述】:

一些背景:我希望制作一个可以基于视觉输入玩视频游戏的程序。虽然我可以在屏幕上显示游戏时将网络摄像头指向我的显示器,但我更愿意通过某种方式将屏幕上的任何像素信息发送到我的程序。

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

我目前正计划使用 Java 和 Matlab 的组合,但我很乐意切换到具有快速抓取屏幕截图的好方法的任何一种语言。哦,我在 Windows 7 上执行此操作,以防此屏幕抓取操作的级别足够低。

【问题讨论】:

    标签: java windows video-capture video-processing


    【解决方案1】:

    如果它是 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】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        你可以做到,但需要复杂的图像处理、手势识别和机器学习算法。 如果您想赢得那场比赛,系统的响应应该是实时的,这自然会使您的研究变得复杂。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-27
          • 2021-12-11
          • 2019-02-28
          • 1970-01-01
          相关资源
          最近更新 更多