альтернатива opencv python для pyautogui.locatecenteronscreen(), только для изображения вместо экрана

мне было интересно, как бы вы использовали opencv (cv2) в python для создания альтернативы функции pyautogui.locatecenteronscreen(), просто используя изображение вместо экрана. я попробую использовать пример.

может быть, определяемая пользователем функция, определить местонахождениеCenterOfTemplate(Path/to/template.png) и теперь, поскольку я использую скриншот в качестве исходного изображения, это будет так же, как если бы я использовал pyautoguis, но для моей основной цели я не буду использовать.

import cv2
import pyautogui

pyautogui.screenshot(Path/to/original_image.png)

def locateCenterOfTemplate(image, template, accuracy=100,
region=#whole screen idk how to do this eaither):


temp = locateCenterOfTemplate("Path/to/original_image.png", "Path/to/template.png")
# now variable "temp" is the same as the posision of the center of the template,
# inside of the source immage
pyautogui.click(temp)

По сути, я хотел бы, чтобы шаблон соответствовал региону, уверенности и как шаблону, так и исходному изображению в качестве функции :)

Спасибо


person kallemoto    schedule 10.12.2020    source источник


Ответы (1)


Если вы загружаете изображение и шаблон с помощью cv2.imread(path). Вы можете использовать cv2.matchTemplate . Некоторое время назад я использовал этот код для сопоставления всех шаблонов на экране с достоверностью выше threshold. Вы можете использовать debug=True, чтобы обвести найденные шаблоны красным цветом (cv2 использует BGR).

 def match_all(image, template, threshold=0.8, debug=False, color=(0, 0, 255)):
        """ Match all template occurrences which have a higher likelihood than the threshold """
        width, height = template.shape[:2]
        match_probability = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
        match_locations = np.where(match_probability >= threshold)

        # Add the match rectangle to the screen
        locations = []
        for x, y in zip(*match_locations[::-1]):
            locations.append(((x, x + width), (y, y + height)))

            if debug:
                cv2.rectangle(image, (x, y), (x + width, y + height), color, 1)
        return locations

Он вернет список ограничивающих рамок для соответствующих областей. Если вы хотите вернуть только самое высокое совпадение, вы должны изменить строку match_locations на:

match_location = np.unravel_index(match_probability.argmax(), match_probability.shape)

В качестве альтернативы, если вы можете использовать другую библиотеку, вы можете взглянуть на Multi-Template- Matching, который возвращает pandas DataFrame с именем шаблона, ограничительной рамкой и оценкой.

person Thymen    schedule 10.12.2020