Соответствие шаблону OpenCV, несколько шаблонов - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь сделать бота для игры.В основном он подбирает предметы с земли, вещь в том, что они иногда выглядят по-разному, например.угол другой, или они лежат на разноцветной земле и т. д. Чтобы все работало, мне нужно несколько шаблонов.Есть ли способ сделать это?Если вы не понимаете, просто скажите мне в комментариях.Вот что я попробовал до сих пор:

files = ["bones_{}.png".format(x) for x in range(6)]

    for i in range(6):
        img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
        f = str(files[i])
        template = cv2.imread(f, 0)
        w, h = template.shape[:: -1]
        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        threshhold = 0.70
        loc = np.where( res >= threshhold)

Это работает, но могло бы быть и лучше.У вас есть идеи?

1 Ответ

0 голосов
/ 19 июня 2019

В вашем текущем коде есть много шагов, выполненных несколько раз, где достаточно одного (на кадр). Вы можете получить эффективность, отделяя их.

В настоящее время вы перезагружаете шаблоны в каждом кадре, это очень неэффективно, поскольку вы легко получите 100+ загрузок в секунду. Вместо этого создайте список, содержащий шаблоны, чтобы они оставались в памяти. Доступ из памяти намного быстрее, чем загрузка с диска.
Вы можете сделать то же самое для ширины / длины шаблонов, но на самом деле они не используются в вашем коде, поэтому, возможно, вы можете пропустить все это вместе.
Порог должен быть установлен только один раз.

templates = []
templ_shapes = []
threshold = 0.70

for i in range(6):
    templates.append(cv2.imread("bones_{}.png".format(i),0))
    templ_shapes.append(templates[i].shape[:: -1])

Все шаблоны можно сравнить с одним и тем же снимком экрана, так что вы должны взять его за пределы цикла for. Это легкая, но довольно большая победа. Поэтому на каждом кадре возьмите экран один раз и сопоставьте все шаблоны. Для наглядности и удобства вы можете поместить его в функцию:

def doTemplateMatch():
    img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
    for template in templates: 
        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        loc = np.where( res >= threshold)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...