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

#python-3.x #opencv #cv2 #template-matching

#python-3.x #opencv #cv2 #сопоставление с шаблоном

Вопрос:

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

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

 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)
 

В принципе, я хотел бы иметь соответствие шаблона с реакцией, уверенностью и как шаблоном, так и исходным изображением в качестве функции 🙂

Спасибо: D

Ответ №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)
 

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