Обнаружение меньшего изображения (.png) в большом изображении, полученном с помощью ImageGrab? - PullRequest
1 голос
/ 27 мая 2019

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

Я пытаюсь заставить ИИ играть в браузерную версию игры Piano Tiles.На данный момент я просто пытаюсь сделать снимок игрового окна (небольшая часть экрана моего компьютера), а затем проверить это игровое окно с помощью .png кнопки запуска игры.Оттуда я продолжу щелкать эту кнопку запуска, но это проблема в другой раз.

Как я могу проверить, содержит ли изображение файл .png?

Вот мой текущий код:

from PIL import ImageGrab as ig, ImageOps as io, Image
import pyautogui
import bbox

def grabStart(window):
    #The start button
    start = Image.open("res/StartButton.PNG")
    start = io.grayscale(start)

    #This is the part I need to figure out. The following is just pseudocode
    if window.contains(start): #I know that this doesn't actually work. Just pseudocode
        #I'd like to return the location of 'start' in one of the following forms
        return either: (x1, y1, x2, y2), (x1, y1, width, height), (a coordinate within 'start'))

def grabGame():
    #The coordinates of the entire game window
    x1 = 2222
    y1 = 320
    x2 = 2850 
    y2 = 1105

    #The entire screen of the game
    window = ig.grab(bbox = (x1, y1, x2, y2))
    window = io.grayscale(window)

    return window

grabStart(grabGame())

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вот способ сделать это.Я просто оставляю программу работающей и открываю / закрываю и перемещаю предварительный просмотр кнопки по экрану, чтобы увидеть, видит ли она кнопку и правильно ли сообщает координаты.

#!/usr/bin/env python3

from PIL import ImageGrab as ig, Image
import pyautogui as ag

def checkButton(button, window):
    try:
        location = ag.locate(button, window, confidence=0.8)
        print(f'location: {location[0]},{location[1]},{location[2]},{location[3]}')
    except:
        print('Not found')

# Load button just once at startup
button = Image.open("button.png")

# Loop, looking for button
while True:
    window = ig.grab()
    checkButton(button, window)
0 голосов
/ 27 мая 2019

Попробуйте использовать pyautogui.locate().Функция принимает на вход два параметра: первый - это изображение, которое нужно найти, второй - это изображение, в котором нужно найти меньшее изображение.Этот метод работает только для изображений, поэтому, если вы хотите запустить его для живого окна, вы можете рассмотреть другой вариант.Во-вторых, pyautogui - это просто оболочка над PIL, поэтому, если вы столкнетесь с проблемами эффективности, вы можете перевести locate() в эквивалент PIL для производительности.

...