#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. Я обновил его с помощью фактического кода, который я выполняю.