Захват игровых скриншотов для использования скриптом Python - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно сделать скриншоты игр для скрипта Python (немного машинного обучения, ИИ с видеоиграми), и меня привели к 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.

Как люди обычно получают ИИ такого рода?Если это вообще возможно, я не хочу использовать для этого кодирование более высокого уровня, так как я делаю это в основном как личный вызов.Я многому научился, чтобы добраться до этого момента, и я не хочу, чтобы программа делала все для меня, только скриншот.Для этого, однако, я не возражаю запутаться в сценариях, если есть способ разобраться в этой проблеме.Однако из того, что я прочитал, я думаю, что мне нужно подключиться к игре, пока она запущена, чтобы сделать это, что может быть или не быть практичным.Заранее спасибо!

1 Ответ

0 голосов
/ 07 июня 2019

Я вижу вопрос довольно старый, но все еще без ответа.Вы можете использовать библиотеку Python mss для захвата экрана.Как я вижу, вы уже импортировали его, но не использовали его.

В их документации уже есть образец:

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 вызовы функции locate занимают около 1 или 2 секунд.

Я предполагаю, что при сужении снимка экрана дообласть интереса, вы можете ускорить процесс.

Если вам нужна дополнительная информация, есть много учебных пособий.Вот, например, репозиторий git для , использующий Python для игры в GTA V .Смотрите ссылки там для связанных видео YouTube и статей.

...