Как использовать pyautogui.locateOnScreen() для нескольких изображений в нескольких регионах?

#python #opencv #python-imaging-library

Вопрос:

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

До сих пор мне удавалось заставить его работать для отдельных объектов, но теперь я пытаюсь адаптировать свой код для нескольких объектов, и я получаю ошибку: expected an image filename, OpenCV NumPy array, or PIL image я пытался использовать как имена файлов, так и массивы NumPy, подробно описанные ниже.

Я попытался i = cv.imread(img, cv.IMREAD_UNCHANGED) загрузить свои изображения в массив OpenCV NumPy и без него, загрузив файлы изображений напрямую, и я получаю ту же ошибку с обоими.

Когда я проверяю, что отладчик cv.imread показывает массивы numpy array([[[124, 23, 1... ype=unit8) и без cv.imread них и загружает изображения напрямую, я вижу [C:\Users\expected.jpg]

 import pyautogui as py import cv2 as cv import glob import PIL.ImgeOps import grayscale  def missions(a):   for x in range (0, a):  regions = {  "region 1": (412,169,473,251),  "region 2": (428,687,457,733),  "region 3": (1278,161,1309,223),  "region 4": (1266,673,1322,753)  }   # intalise empty array  missionShipList = []  # Get list of all files from directory  directory = glob.glob( r"C:usersstevphen*.jpg")    # add images to array  for file in directory:  if file.endswith('.png') or file.endswith('.jpg'):  missionShipList.append(file)    if missionShipList is None:  print("failed to load template.")  quit()   for x in range (0, a):  for region_name, region in regions.items():  missionShips = py.locateOnScreen(missionShipList, region=region, grayscale=True, confidence=0.86)  if missionShips != None:  print(f"Cicked a mission ship in {region_name}")  py.click(missionShips)  missions(3)  

И я также пытался использовать im.read для добавления изображений в свой массив:

 for file in directory:  cv.imread(file, cv.IMREAD_UNCHANGED)  missionShipList.append(file)    

Отображение переменной, заполненной, как и ожидалось:

Отображение заполненной переменной

Я также попытался просмотреть изображения по отдельности и удалить оттенки серого. Та же ошибка.

 for x in range (0, a):  for region_name, region in regions.items():  for ships in missionShipList:  py.locateOnScreen(missionShipList, region=region, confidence=0.86)  

Что мне нужно изменить, чтобы правильно загружать изображения, и почему отладчик показывает, что список сообщений заполняется, когда locateOnScreen возникает ошибка?

Комментарии:

1. вызывать что-то list -плохая идея, потому что это list тип в python- img не определен в цикле-пожалуйста, практикуйтесь в отладке кода python. ищите учебный материал.

2. На самом деле это в основном моя неспособность составить пример извинений за код. Я обновлю фактический код, который используется сейчас. Основная проблема, с которой я столкнулся, заключается в том, что обе версии, которые я пробовал, правильно отображаются в отладчике, в них правильно загружены объекты. Я получаю как отображение массива numpy, так и полный путь к файлу, показывающий изображение. Любой из них должен работать, но оба дают мне одну и ту же ошибку.

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

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