Я написал код для сопоставления с шаблоном в 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)