Нахождение изображения внутри изображения (используя CV2) - PullRequest
1 голос
/ 20 сентября 2019

Я использую CV2, и я хочу обнаружить изображение внутри изображения.Вот ситуация:

Base Image

У меня есть это базовое изображение, и я пытаюсь определить текущий отображаемый символ.В игре около 30 персонажей, поэтому я думал о создании png для каждого персонажа (character1.png, character2.png и т. Д.), Чтобы я мог найти текущего персонажа, которого играет пользователь.Вот пример шаблона character1.png :

Template

Я хочу сопоставить шаблон с этой областьюобраз.Проблема в том, что если несколько человек в игре играют с одним и тем же персонажем, их персонажи также будут обнаружены.Но я только хочу, чтобы персонаж клиента был обнаружен.Персонаж клиента всегда будет в левом нижнем квадранте игры.

Это мой код:

import cv2
import numpy as np

img_bgr = cv2.imread('base.png')
img_gry = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

template = cv2.imread('search.png', 0)

w, h = template.shape[::-1]

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

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

cv2.imshow('detected', img_bgr)

Пока что он работает немного так, как я хочу.Он ставит желтый прямоугольник вокруг символа:

Example

Однако, если бы было несколько человек с одним и тем же персонажем, персонаж другого человека получал быобнаружено также.Мне было интересно, существует ли в cv2 функция для поиска только в пределах определенной области базового изображения (той нижней левой области, где находится символ клиента).Более того, мне не нужно отображать желтый прямоугольник, это было только в качестве теста.Итак, мне было интересно, могу ли я просто заставить cv2 сказать «обнаружен символ 1», «обнаружен символ 2» и т. Д., Если шаблон был найден в регионе.

Итак, я хочу, чтобы моя программа работала циклически.через символы (1-30) .png, и как только он находит правильный символ, который играет клиент, он скажет: «Вы играете символ N (n = 1-30). Мне интересно, если это эффективный способобнаружения персонажа клиента.

1 Ответ

0 голосов
/ 20 сентября 2019

Вы можете выбрать ROI (область интереса) области, где находится персонаж.А затем проверьте, найден ли шаблон только в этой области:

import cv2
import numpy as np

img_bgr = cv2.imread('base.png')
img_gry = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

template = cv2.imread('search.png', 0)

w, h = template.shape[::-1]
roi_start = (430, 550) # top left corner of the selected area
roi_end = (526,651) # bottom right corner of the selected area

roi = img_gry[roi_start[1]: roi_end[1], roi_start[0]: roi_end[0]]
res = cv2.matchTemplate(roi, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
    if pt is not None:
        print("character found")
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...