Шаблон соответствует скриншоту с использованием OpenCV - PullRequest
2 голосов
/ 10 февраля 2020

Чего я хочу добиться, так это захватить мой экран в режиме реального времени и заставить его обнаруживать, когда в кадре отображается определенное изображение. До сих пор я придумал:

Снимок экрана:

last_time = time.time()
while(True):
    screen = np.array(ImageGrab.grab(bbox=(0,40, 800, 640)))
    print('Loop took {} seconds'.format(time.time()-last_time))
    last_time = time.time()
    cv2.imshow('window', cv2.cvtColor(screen, cv2.COLOR_BGR2RGB))
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

Соответствие шаблонам:

import cv2
import numpy as np

img_rgb = cv2.imread('frame.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)

template = cv2.imread('template.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)

cv2.imshow('Detected',img_rgb)

cv2.waitKey(0)
cv2.destroyAllWindows()

Я заставил их обоих работать по отдельности, но не смог соединить их вместе. В основном я боролся с imread () текущего кадра, так как он возвращается как nparray из захвата, в то время как cv2.imread () требует файл изображения (png., Jpg. Ect.)

1 Ответ

1 голос
/ 10 февраля 2020
  • Загрузите изображение шаблона перед циклом while(True);
  • Внутри l oop, убедитесь, что преобразовали screen из RGB в СЕРЫЙ;
  • Затем, выполните эти 3 строки кода соответствия шаблона;
  • Наконец, чтобы отобразить выходные данные с прямоугольниками, нарисуйте их на screen, а не на его аналоге в оттенках серого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...