如何使用pyautogui.locateOnScreen()在多个区域查找多张图片
报错根本原因
pyautogui.locateOnScreen 仅支持传入单个图片路径、单个OpenCV NumPy数组或单个PIL图片对象,你直接把整个图片列表missionShipList作为参数传入,触发了参数类型校验报错。你后续尝试遍历列表时,依然错误传入了整个列表,没有使用遍历出来的单张图片变量。
需要修改的具体问题
- 参数传入错误:遍历图片列表后,要把单张图片变量传给
locateOnScreen,不要传整个列表 - cv读取逻辑错误:你调用了
cv.imread但没有保存返回的数组,还是把原文件路径加入列表,读取操作未生效 - 导入语句错误:原导入语句写法、拼写均有问题,PIL的导入格式不对
- 无效判断逻辑:你初始化的
missionShipList是列表类型,永远不可能等于None,判断为空要用if not missionShipList - 冗余循环逻辑:外层已经有执行次数循环,内层重复写了相同的循环,导致逻辑重复执行
- region参数大概率错误:pyautogui的
region参数格式为(左上角x, 左上角y, 区域宽度, 区域高度),你当前填写的看起来是左上角+右下角的坐标,会导致识别区域完全不符合预期,需要按格式调整
修正后可运行代码
import pyautogui as py import cv2 as cv import glob # 修正导入语句 from PIL.ImageOps import grayscale def missions(a): # 固定配置提到循环外,避免重复初始化 regions = { "region 1": (412, 169, 61, 82), # 按(左,上,宽,高)格式修改的示例,需自行计算每个区域的正确宽高 "region 2": (428, 687, 29, 46), "region 3": (1278, 161, 31, 62), "region 4": (1266, 673, 56, 80) } # 提前加载所有模板图片,避免重复读盘 missionShipList = [] directory = glob.glob(r"C:\users\stevphen\*.jpg") for file in directory: if file.endswith('.png') or file.endswith('.jpg'): # 方式1:直接存图片路径(二选一即可) # missionShipList.append(file) # 方式2:存cv读取的数组(二选一即可) img = cv.imread(file, cv.IMREAD_UNCHANGED) if img is not None: missionShipList.append(img) # 修正空列表判断 if not missionShipList: print("failed to load template.") return for _ in range(a): for region_name, region in regions.items(): # 遍历单张图片做识别 for ship_template in missionShipList: missionShips = py.locateOnScreen(ship_template, region=region, grayscale=True, confidence=0.86) if missionShips is not None: print(f"Clicked a mission ship in {region_name}") py.click(missionShips) # 找到目标后可加break跳出当前区域循环,避免重复点击 break missions(3)
内容的提问来源于stack exchange,提问作者Stevphen
相关产品推荐
相关产品推荐

