捕获游戏截图以供Python脚本使用

时间:2018-10-23 06:11:47

标签: python python-3.x artificial-intelligence screenshot

我需要为Python脚本(一些机器学习,带有视频游戏的AI)拍摄游戏的屏幕截图,并且被带到FRAPS。 FRAPS和其他类似软件可以根据需要捕获屏幕截图-据我所知,我需要知道文件的名称,更重要的是,我需要将其与其他屏幕截图区分开来或删除这些屏幕截图我一完成他们的工作。 FRAPS的命名系统(以及Bandicam的命名系统)要求我知道拍摄照片的时间,大约是千分之一秒(据我所知)。该程序将在动态的,对时间敏感的情况下运行,因此我只想像我在Greenshot中那样设置一个命名方案(也就是说,除非真的很容易找到要保存的文件,否则我不感兴趣在游戏过程中进行卷积文件搜索,否则我可能会不愿接受。FRAPS游戏视频已经滞后了,以至于随机错误地破坏了游戏脚本同步功能。我既关心游戏中的总体系统性能,又关心算法的响应能力。毕竟,我已经知道下一步是在屏幕上或图像的一部分中找到图像,这很麻烦。

我对任何可以将图像文件(我一直计划使用.png,但可以使用任何无损文件类型)的图像文件(软件,模块或代码)都满意,可以将其放置在程序目录中。图片。将其保存到剪贴板也可以,因为可以从那里保存和操作它。无论如何,我对于这些屏幕截图中的大多数并没有长期使用。如果只可以截取屏幕一部分的屏幕截图,那也将是更好的选择。

我怀疑这很重要,但是下面是我程序的简略伪代码。我真的不需要任何故障排除方法。

    import os,sys,subprocess,mss,mss.tools,time as sleepy,keyboard,sys,pyscreenshot as Grabby
    from random import randint as spinny
    from PIL import Image
    from pyautogui import * # Just to help with what I've been using, a lot of these aren't currently in use
    class nameOfGame:
        magicNumbers = {'whereStuffIs': (500,500),'generalDelay':0.05,'Hotkey':'f10','fileName':'lmno.png'}
        def __init__(self,magicNumbers):
            os.startfile(gameLocation)

        def Play(self):
            if(self.goAhead()):

moveTo(self.magicNumbers['whereStuffIs'])                
click(self.magicNumbers['whereStuffIs']) #How do I format this correctly on StackOverflow?

        def ScreenShot(self):
            if(softWareScreenSshot):# Outside software is getting the screenshot
                press(self.magicNumbers['Hotkey'])
            else: # Python module or other method...?
                PseudoModule.takeAScreenshot()
            load(self.magicNumbers['fileName'])

        def goAhead(self):
            return True # This is a placeholder for AI.

人们通常如何获得这种AI?如果有可能,我不想为此使用任何更高级别的编码,因为我主要是将其作为个人挑战。到目前为止,我已经学到了很多东西,我不想让程序为我做任何事情,只是截图。但是,为此,如果有办法解决这个问题,我不介意弄乱脚本。但是,从我阅读的内容来看,我认为我需要在游戏运行时加入游戏,这可能是可行的,也可能是不现实的。预先感谢!

1 个答案:

答案 0 :(得分:0)

我看到这个问题已经很老了,但是仍然没有答案。 您可以使用python库mss来抓取屏幕。如我所见,您已经导入了它,但没有使用它。

In their documentation is already a sample:

import time
import cv2
import mss
import numpy

with mss.mss() as sct:
  # Part of the screen to capture
  monitor = {"top": 40, "left": 0, "width": 800, "height": 640}

  while "Screen capturing":
      last_time = time.time()
      # Get raw pixels from the screen, save it to a Numpy array
      img = numpy.array(sct.grab(monitor))

      # Display the picture
      cv2.imshow("OpenCV/Numpy normal", img)

      # Display the picture in grayscale
      # cv2.imshow('OpenCV/Numpy grayscale',
      #            cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY))

      print("fps: {}".format(1 / (time.time() - last_time)))

      # Press "q" to quit
      if cv2.waitKey(25) & 0xFF == ord("q"):
          cv2.destroyAllWindows()
          break

如我所见,您还发现了PyAutoGui。它有一个locate function来查找屏幕上的区域,但是速度很慢。他们写在文档中

  

在1920 x 1080屏幕上,定位功能调用大约需要1或2   秒。

我认为通过将屏幕快照缩小到感兴趣的区域,您可以加快速度。

如果您需要更多信息,可以找到许多教程。例如,这是using Python to play GTA V的git存储库。请参阅此处的链接,以获取相关的youtube视频和文章。