OpenCV. Неверно ищет совпадения
Изображение на котором ищу совпадения.

Код:
from PIL import ImageGrab
import os
import time
import cv2
import numpy as np
def find_arrow():
img = cv2.imread("screenshot.png") # Картинка с объектом
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Преобразуем в серую
template = cv2.imread("Screenshot_1.png", cv2.IMREAD_GRAYSCALE) # Шаблон
w,h = template.shape[::-1]
result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= 0.5)
# Рисует прямоугольник вокруг объекта
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 200, 0), 3)
cv2.imshow("img", img) # Выводит на экран результат
cv2.waitKey()
def screenshot():
gameWindow = (300, 100, 1720, 780)
im = ImageGrab.grab(gameWindow)
output = im.save(os.getcwd() + '\\screenshot' + '.png', 'PNG')
print('Скриншот сделан и сохранён')
if __name__ == '__main__':
# time.sleep(3)
# screenshot()
find_arrow()
Ответы (1 шт):
Автор решения: Alex Alex
→ Ссылка
Используйте cv2.matchTemplate с маской объекта. На скриншоте ведь у вас объект не на белом фоне, как в шаблоне. Плюс шаблон у вас с альфа-каналом, его и можно сделать маской. Измененная функция:
def find_arrow():
img = cv2.imread("screenshot.jpg") # Картинка с объектом
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Преобразуем в серую
template = cv2.imread("Screenshot_1.png", cv2.IMREAD_UNCHANGED)
mask=template[:,:,3] # извлекаем альфа-канал как маску
template = cv2.cvtColor(template, cv2.COLOR_BGRA2GRAY) # серый шаблон
w,h = template.shape[::-1]
result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED, mask=mask)
loc = np.where(result >= 0.55) # подбираем порог
# Рисует прямоугольник вокруг объекта
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 200, 0), 3)
cv2.imshow("img", img) # Выводит на экран результат
cv2.waitKey()


