#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 с именем шаблона, ограничительной рамкой и оценкой.