Найдите второе местоположение аналогичного изображения с помощью pyautogui

#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:

Приведение некоторых текстовых примеров кода-это здорово. Так что мне не пришлось бы задавать этот глупый вопрос. Вы пробовали цикл «пока»?