Python 在使用ImageGrab检索的较大图像中检测较小的图像(.png)?

Python 在使用ImageGrab检索的较大图像中检测较小的图像(.png)?,python,python-imaging-library,Python,Python Imaging Library,在过去的一个小时里,我一直在研究这个简单的主题,但我遇到的所有答案都非常复杂,作为Python的新手,我无法将其中任何一个整合到我的程序中 我正在尝试让AI玩一个浏览器版的钢琴游戏。到目前为止,我只是简单地尝试捕获游戏窗口(我电脑屏幕的一小部分),然后用游戏开始按钮的.png检查游戏窗口。从那里,我将继续点击开始按钮,但这是一个问题,为下一次 如何检查图像是否包含.png文件? 这是我目前的代码: from PIL import ImageGrab as ig, ImageOps as io,

在过去的一个小时里,我一直在研究这个简单的主题,但我遇到的所有答案都非常复杂,作为Python的新手,我无法将其中任何一个整合到我的程序中

我正在尝试让AI玩一个浏览器版的钢琴游戏。到目前为止,我只是简单地尝试捕获游戏窗口(我电脑屏幕的一小部分),然后用游戏开始按钮的.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())

尝试使用
pyautogui.locate()
。函数输入两个参数,第一个是需要查找的图像,第二个是需要查找较小图像的图像。此方法仅适用于图像,因此如果您想为活窗口运行此操作,则可以考虑另一个选项。其次,
pyautogui
只是
PIL
的一个包装器,因此如果您遇到效率问题,您可能需要将
locate()
转换为其与PIL等效的性能。

尝试使用
pyautogui.locate()
。函数输入两个参数,第一个是需要查找的图像,第二个是需要查找较小图像的图像。此方法仅适用于图像,因此如果您想为活窗口运行此操作,则可以考虑另一个选项。其次,
pyautogui
只是
PIL
的一个包装器,因此如果您遇到效率问题,您可能需要将
locate()
转换为它的PIL等价物以提高性能。

下面是一种方法。我只是让程序运行,打开/关闭并在屏幕上移动按钮预览,看看它是否能找到按钮并正确报告坐标

#!/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)

这里有一个方法。我只是让程序运行,打开/关闭并在屏幕上移动按钮预览,看看它是否能找到按钮并正确报告坐标

#!/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)

@谢谢你的编辑建议。我接受了他们所有,除了舍邦,我更喜欢离开,所以很明显我的目标是蟒蛇3。我讨厌在网上找到适合蟒蛇2的东西却没有意识到。真是一个骗局?我不熟悉Linux的东西,所以请原谅。@VasuDeo.S它告诉shell使用哪个程序来运行脚本。Windows依赖于文件名中的扩展名,但Linux/macOS不依赖。所以,我可以在Linux上编写一个没有扩展的脚本,它仍然知道如何运行它。Windows忽略shebang,因此它在Windows上是无害的。因此,在linux上,您可以编写一个名为
Mark
的python文件,而不需要
.py
扩展名,只需添加
#/usr/bin/env python3
在python文件的开头,操作系统会将该文件解释为python文件吗?如果文件保存为
Mark.py
,会发生什么?这两者都会产生同样的效果吗?谢谢你花时间回答我的疑问。^^^^@VasuDeo.S谢谢你的编辑建议。我接受了他们所有,除了舍邦,我更喜欢离开,所以很明显我的目标是蟒蛇3。我讨厌在网上找到适合蟒蛇2的东西却没有意识到。真是一个骗局?我不熟悉Linux的东西,所以请原谅。@VasuDeo.S它告诉shell使用哪个程序来运行脚本。Windows依赖于文件名中的扩展名,但Linux/macOS不依赖。所以,我可以在Linux上编写一个没有扩展的脚本,它仍然知道如何运行它。Windows忽略shebang,因此它在Windows上是无害的。因此,在linux上,您可以编写一个名为
Mark
的python文件,而不需要
.py
扩展名,只需添加
#/usr/bin/env python3
在python文件的开头,操作系统会将该文件解释为python文件吗?如果文件保存为
Mark.py
,会发生什么?这两种方法都会产生同样的效果吗?谢谢你花时间回答我的疑问。^ ^我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢