2011-06-30 18 views
2

一些背景:我希望製作一個可以根據視覺輸入播放視頻遊戲的程序。當遊戲在屏幕上時,我可以將監視器指向我的監視器,但我寧願只是通過某種方式將屏幕上的任何像素信息發送到我的程序。如何將我的顯示器的輸出用作程序的輸入?

具體來說,我希望以30fps的速率對屏幕截圖進行採樣並對它們進行計算。到目前爲止,我唯一能想到的就是當我的程序「按下」某個鍵時,使用Fraps截取屏幕截圖,但這些只能以每秒一次的最大速率進行,並且需要使用此外部程序。我希望有一些方法可以更直接地攔截這些屏幕信息。

我目前正在計劃使用Java和Matlab的組合,但我很樂意切換到哪種語言有快速截取屏幕截圖的好方法。哦,我正在Windows 7上執行此操作,以防萬一此屏幕抓取操作的低級別足夠重要。

回答

2

如果是2D Java遊戲,您只需將它發送到framebuffer以及您的視覺輸入程序。如果它是3D和Java,那麼你可以在遊戲編寫庫中使用截圖功能做類似的事情。如果它是另一個窗口中的遊戲,可以嘗試使用java.awt.Robothttp://download.oracle.com/javase/1,5.0/docs/api/java/awt/Robot.html)並查看截圖功能是否有效。你會得到一個BufferedImage,你會發送到視覺輸入程序(就像從Java 2D或3D應用程序發送遊戲視圖一樣)。

+0

工程就像一個魅力!機器人課對我來說真是令人大開眼界... – zergylord

+0

很高興它的工作! :) –

0

你可以做到這一點,但複雜的圖像處理,手勢識別和機器學習算法。 如果你想贏得那種自然會讓你的研究變得複雜的遊戲,那麼系統的響應應該是實時的。

但是,如果原始遊戲是由您自己開發的,那麼您可能不需要任何圖像處理,攝像頭和FRAPS。在這種情況下,所有你需要的是機器學習遊戲。

2

我會刺探回答你的問題。基本的答案是屏幕數據本身是內存映射的,所以它駐留在物理內存的某個地方。但是,您的操作系統可能會阻止您直接通過其虛擬內存系統訪問該內存。因此,要訪問的唯一辦法是,要麼:

一)寫一個設備驅動程序來訪問它 或 b)利用別人寫的設備驅動程序來訪問它

在Windows下你可以使用DirectX訪問屏幕數據。本網站解釋如何做到這一點:

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

相關問題