Как оптимизировать сопоставление шаблонов с OpenCV и Python - PullRequest
0 голосов
/ 15 октября 2019

Я написал код для сопоставления с шаблоном в Pythons OpenCV lib.

Данные - футболисты. Я создал набор данных для шаблонов с более чем 100 изображениями лица Месси Лайонела.

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

1 Часть: я использовал haarcascade для обнаружения лиц на изображении, и я получаю размер извлеченных лиц / изображение лица

2 Часть: у меня естьзагрузил более 100 шаблонов и изменил их размер до размера обнаруженного лица (1 часть)

3 часть: Я выполнил сопоставление шаблонов с измененными шаблонами и исходным изображением.

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

Вы можете скачать набор данных здесь:

https://www.sendspace.com/filegroup/XxOrEtkpmRtyVkJTp22ESQ

Это мой код:

import numpy as np
import cv2
import os
import random

# Read templates

data_folder = r'C:\Users\Pc\Desktop\FaceDetection'
categories = ['Messi']    
templates = []

#LOADING TEMPLATES AND CREATING LIST OF TEMPLATES
def get_templates(width, height):

    for cat in categories:

        path = os.path.join(data_folder, cat)

        for img in os.listdir(path):
            try:

                img_array = cv2.imread(os.path.join(path,img), 0)
                img_array = cv2.resize(img_array,(int(width),int(height)))

                templates.append([img_array,cat])

            except:
                pass


# Downloading multiple cascades: https://github.com/Itseez/opencv/tree/master/data/haarcascades
# loading cascades for detection

frontal_face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# IMPORTING THE IMAGE AND CONVERTING IT TO GRAY SCALE
my_image = r'C:\Users\Pc\Desktop\FaceDetection\for_comparing.jpg'
img = cv2.imread(my_image, 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = frontal_face_cascade.detectMultiScale(gray, 1.2, 5)

for (x,y,w,h) in faces:

    #FINDING FACES WITH RECTANGLE
    #cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0), 1)

    # GETTING SIZE OF DETECTED FACE
    face_color = img[y:y+h, x:x+w]
    face_gray = gray[y:y+h, x:x+w]

    #SHOWING DETECTED FACES
    #cv2.imshow('img',face_color)
    #cv2.waitKey(0)

    # SIZE OF DETECTED FACES ARE INTO VARIABLES
    height, width, c = face_color.shape

    # CALLING THE FUNCTION FOR TEMPLATES
    get_templates(width, height)
    random.shuffle(templates)

    for template in templates: # FOR EACH TEMPLATE IN TEMPLATE LIST

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

        res = cv2.matchTemplate(gray, template[0], cv2.TM_CCOEFF_NORMED)

        threshold = 0.90 # I HAVE TRIED VALUES FROM 0.75 TO 0.95

        # Store the coordinates of matched area in a numpy array 
        loc = np.where(res >= threshold)

#IF MATCH IS FOUND, DRAW RECTANGLE AROUND IT
        if len(loc[0]) != 0:
            print("FOUND", template[1])

            # Draw a rectangle around the matched region. 
            for pt in zip(*loc[::-1]):

                rec = cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1)
                cv2.putText(rec, template[1], (x, y-3), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 1)


cv2.imshow('img',img)
cv2.waitKey(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...