#python #pyautogui
Вопрос:
Проблема кажется довольно простой, у меня есть два похожих изображения на экране, используя pyautogui.LocateOnScreen() обычно он может найти первое изображение, используя moveTo (), что позволяет мне перейти к рассматриваемому изображению. Проблема в том, что у меня есть более одного изображения, и я хочу, чтобы оно обнаружило первое, затем переместилось к нему, затем обнаружило другое и, наконец, переместилось к нему. Кто-нибудь может помочь мне с этим вопросом? Спасибо. PS: Оба изображения равны
Ответ №1:
Способ 1
С помощью pyautogui.locateAllOnScreen()
:
import pyautogui
image = 'TemplateImage.png'
for box in pyautogui.locateAllOnScreen(image):
print(pyautogui.center(box))
pyautogui.locateAllOnScreen()
возвращает список из 4-х кортежей, представляющих (слева, вверху, по ширине, высоте) прямоугольник, окружающий область, в которой расположен шаблон. Чтобы найти центр этой коробки, мы позвонили pyautogui.center()
Способ 2
Если изображения шаблона всегда расположены в одной и той же части экрана, мы можем использовать region
аргумент, чтобы ограничить местоположение, в котором pyautogui.LocateOnScreen()
выполняется поиск шаблона. Мы ищем два раза, каждый раз в другом регионе:
box1 = pyautogui.locateOnScreen('TemplateImage.png', region=(0,0, 300, 400))
center1 = pyautogui.center(box1)
box2 = pyautogui.locateOnScreen('TemplateImage.png', region=(300, 400, 300, 400))
center2 = pyautogui.center(box2)
Способ 3
Используйте opencv-python для сопоставления шаблонов. После обнаружения изображения шаблона на скриншоте вы можете замаскировать обнаруженную область и повторно запустить сопоставление шаблона:
import cv2
import pyscreeze
import pyautogui
import matplotlib.pyplot as plt
#load the image to find
image = 'TemplateImage.png'
templateim = pyscreeze._load_cv2(image,grayscale=False)
(w, h,_) = templateim.shape
# get screenshot
screenim_color = pyautogui.screenshot()
screenim_color = cv2.cvtColor(np.array(screenim_color),cv2.COLOR_RGB2BGR)
Nsearch = 2 # number of times to search
center_locations = [] #list to store locations
for k in range(Nsearch):
result = cv2.matchTemplate(screenim_color, templateim, cv2.TM_CCOEFF_NORMED) # template matching
(_, _, _, maxLoc) = cv2.minMaxLoc(result) # get the location where the correlation coefficient is maximum (This is the top-left tip of the box surrounding the template)
cv2.rectangle(screenim_color, maxLoc, (maxLoc[0] h, maxLoc[1] w), (0,0,255), -1) # mask the detected region by drawing a solid rectangle over it
center_loc = (int(maxLoc[0] h/2),int(maxLoc[1] w/2)) # get the center location
center_locations.append(center_loc) # append to list
plt.figure()
plt.imshow(screenim_color)
Ответ №2:
Приведение некоторых текстовых примеров кода-это здорово. Так что мне не пришлось бы задавать этот глупый вопрос. Вы пробовали цикл «пока»?