2017-10-13 18 views
1

私はpyautogui.press( 'space')を呼び出す必要があるプロジェクトで作業していましたが、これが呼び出されたときには目立つ量の遅延があります。私は、OpenCVが使用されているので、コードをかなり速く走らせておく必要があります。 pyautogui.press( 'space')が呼び出されたときにコードが遅くなるのを防ぐ方法を誰かが知っていれば、それはすばらしいことになります。恐竜がジャンプする度に、このビデオの遅れを見ることもできます:https://www.youtube.com/watch?v=vceDabnT3OE。ここでpyautogui.press()が呼び出されたときに遅れを引き起こす

はコードです:

import numpy as np 
import cv2 
import pyautogui 
import time 
from PIL import ImageGrab 

# Defining Template Images 
gameOver = cv2.imread('GameOver.png') 
dino = cv2.imread('Dino.png') 
smallCactus = cv2.imread('SmallCactus.png') 
bigCactus = cv2.imread('BigCactus.png') 
ptero = cv2.imread('Ptero.png') 

# Assigning Sample Image Dimensions 
h, w = dino.shape[:-1] 
sch, scw = smallCactus.shape[:-1] 
bch, bcw = bigCactus.shape[:-1] 
ph, pw = ptero.shape[:-1] 

# Time Variables 
lastTime = time.time() 
runningTime = 0 

# Key Variables 
keyDown = False 

pyautogui.keyDown('space') 

while True: 
    # Capturing Screen 
    # 'bbox' Is Rectangle Around The Game 
    screen = np.array(ImageGrab.grab(bbox=(150,125,800,300))) 

    # Time stuff 
    #print('Loop took {} seconds'.format(time.time() - lastTime)) 
    runningTime += time.time() - lastTime 
    lastTime = time.time() 

    # Checking If Game Over 
    gameOverRes = cv2.matchTemplate(screen, gameOver, cv2.TM_CCOEFF_NORMED) 
    minValG, maxValG, minLocG, maxLocG = cv2.minMaxLoc(gameOverRes) 

    if maxValG >= 0.9 and runningTime > 4: 
     print('Game Ended In ', int(round(runningTime)), ' Seconds') 
     pyautogui.press('space') 
     runningTime = 0 

    # Finding Dinosaur 
    dinoRes = cv2.matchTemplate(screen, dino, cv2.TM_CCOEFF_NORMED) 
    minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dinoRes) 

    # Finding Small Cacti 
    smallCactusRes = cv2.matchTemplate(screen, smallCactus, cv2.TM_CCOEFF_NORMED) 
    smallCactusThreshhold = 0.725 
    smallCactusLoc = np.where(smallCactusRes >= smallCactusThreshhold) 

    # Finding Big Cacti 
    bigCactusRes = cv2.matchTemplate(screen, bigCactus, cv2.TM_CCOEFF_NORMED) 
    bigCactusThreshhold = 0.725 
    bigCactusLoc = np.where(bigCactusRes >= bigCactusThreshhold) 

    # Finding Pterodactyls 
    pteroRes = cv2.matchTemplate(screen, ptero, cv2.TM_CCOEFF_NORMED) 
    minValP, maxValP, minLocP, maxLocP = cv2.minMaxLoc(pteroRes) 

    # Drawing Box Around Dinosaur 
    cv2.rectangle(screen, maxLoc, (maxLoc[0] + w, maxLoc[1] + h), (0, 255, 0), 2) 

    # Avoiding Closest Small Cactus 
    if smallCactusLoc[0].size > 0: 
     leftmostXS = min(smallCactusLoc[1]) 
     leftmostYS = min(smallCactusLoc[0]) 

     distS = (leftmostXS - maxLoc[0]) 

     if (distS < 175 and distS > 0): 
      pyautogui.press('space') 

     cv2.rectangle(screen, (leftmostXS, leftmostYS), (leftmostXS+scw, leftmostYS+sch), (255, 160, 0), 2) 

    # Avoiding Closest Big Cactus 
    if bigCactusLoc[0].size > 0: 
     leftmostXB = min(bigCactusLoc[1]) 
     leftmostYB = min(bigCactusLoc[0]) 

     distB = (leftmostXB - maxLoc[0]) 

     if distB < 175 and distB > 0: 
      pyautogui.press('space') 

     cv2.rectangle(screen, (leftmostXB, leftmostYB), (leftmostXB+bcw, leftmostYB+bch), (255, 0, 0), 2) 


    # Avoiding Pterodactyls 
    # Check 'maxValP' Because Otherwise Dino Gets Mistaken As Pterodactyl 
    # 'keyDown' Is Needed For Down Arrow, Otherwise It Doesn't Work Properly 
    if maxValP >= 0.60: 

     distP = maxLocP[0] - maxLoc[0] 
     heightP = maxLoc[1] - maxLocP[1] 

     if distP < 190 and distP > 0: 
      if heightP > 10: 
       keyDown = True 
       pyautogui.keyDown('down') 
      else: 
       pyautogui.press('space')    

     cv2.rectangle(screen, maxLocP, (maxLocP[0] + pw, maxLocP[1] + ph), (0, 0, 255), 2) 

    # elif keyDown == True: 
     # pyautogui.keyUp('down') 
     # keyDown = False 

    # Showing Image 
    cv2.imshow('Dino Game', cv2.cvtColor(screen, cv2.COLOR_BGR2RGB)) 

    # Quit 
    if cv2.waitKey(1) & 0xFF == 27: 
     cv2.destroyAllWindows() 
     break 

答えて

0

私はPyAutoGUIの著者です。 PyAutoGUIには、スクリプトがバグでシャットダウンしたい場合に役立つ「フェイルセーフ」機能がありますが、マウスを動かしてキーボードを打つことができない場合があります。すべてのPyAutoGUIコールの後に0.1秒の遅延があり、右上にマウスを押し込む機会が与えられます(マウスが座標(0、0)にある場合、PyAutoGUIはFailSafeExceptionを上げます)。

10秒遅延は、ユーザにマウスの左上隅に移動する機会を与える。しかし、あなたはまた0pyautogui.PAUSEを設定することで、これを無効にすることができます

>>> pyautogui.PAUSE = 0 

しかし、これは何かのアップネジとスクリプトは、マウスは常に周りをクリックして生じた場合、あなたはあなたのスクリプトを殺す難しく時間を持っているかもしれないことを意味します。

関連する問題