首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获游戏截图供Python脚本使用

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

Stack Overflow用户
提问于 2018-10-23 06:11:47
回答 1查看 3.6K关注 0票数 6

我需要为Python脚本拍摄游戏的截图(有点机器学习,人工智能和电子游戏),我已经被引导到框架。FRAPS和其他类似的软件可以捕获我想要的截图--但据我所知,我需要知道文件的名称,更重要的是,我需要将它与其他截图区分开来,或者在我完成这些截图后立即删除它们。FRAPS的命名系统(以及Bandicam的)要求我知道拍摄时的时间(据我所知)到千分之一秒(据我所知)。该程序将运行在一个动态的,时间敏感的情况下,所以我只想有一个集合命名方案,我可以做在格林斯潘(也就是说,除非它真的很容易找到文件保存,我不感兴趣的卷积文件搜索在游戏期间,因为我可能是开放的。获取框架游戏视频已经落后到足以破坏游戏脚本同步的功能与随机错误)。我既关心游戏中的一般系统性能,也关心算法响应性。毕竟,我已经知道下一步是在屏幕上或其中的一部分找到一个图像,这将是沉重的负担。

我会对任何东西--软件、模块或代码--感到满意,它们可以将图像文件(我一直计划使用.png,但任何无损的文件类型都可以)作为映像放到程序目录中。将其保存到剪贴板上也同样有效,就像可以从那里保存和操作一样。无论如何,这些截图的大部分我都没有长期的用途。它也会更好,如果它可以只拍摄屏幕的一段截图。

我怀疑这有什么关系,但这里有一些浓缩的伪代码,我的程序是什么样子。我真的不需要对它进行任何故障排除。

代码语言:javascript
复制
    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.

人们通常是如何获得这种人工智能的?如果可能的话,我不想为此使用任何更高级别的编码,因为我主要是作为个人的挑战来这样做的。我已经学到了很多东西,我不想让一个程序为我做所有的事情,只是截图。然而,为了达到这个目的,如果有办法解决这个问题,我不介意用脚本来弄乱。然而,根据我所读到的,我认为我需要在游戏运行时使用它,这可能是实用的,也可能是不实用的。提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-06-07 14:18:48

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

在他们的文件中已经有一个样本:

代码语言:javascript
复制
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。它有一个定位函数来查找屏幕上的区域,但速度相当慢。他们在文件里写

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

我想,如果把截图缩小到感兴趣的区域,你可以加快速度。

如果你需要更多的信息,那里有很多教程。例如,下面是一个用于使用Python播放GTA V的git存储库。有关youtube视频和文章,请参阅那里的链接。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52942219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档