Ich verwende Haarcascade_frontalface von OpenCV, um das Gesicht zu erkennen, aber im Gegensatz zu SIFT und SURF scheint es kein unveränderliches Merkmal bei der Rotation zu sein, und selbst wenn ich das Gesicht ein wenig neige, wird das Gesicht nicht erkannt.
Wenn Sie die Kamera in Echtzeit mit einem Kamerabild erkennen, wird dies vernünftigerweise erkannt, da normale Menschen ihren Kopf gerade richten. Wenn Sie ein Foto erkennen, das von selbst so geneigt ist, wird es nicht richtig erkannt.
Auf diesem Foto hat nur Reni Takashiro, die geradeaus schaut, ihr Gesicht entdeckt.
Die Idee ist, dass, wenn nur ein bestimmter Winkel erkannt wird, das Bild selbst gekippt werden sollte und wenn alle Bilder beurteilt werden, deren Neigung in kleinen Schritten geändert wird, werden alle geneigten Flächen erkannt. richtig.
Die Schritte sind wie folgt
In der Abbildung sieht es so aus
Dies ist der Quellcode zum Ausschneiden und Speichern des Gesichtsfotos.
import cv2
import numpy as np
import os
from math import ceil
temp_face_img_path = 'work/temp/face/'
#Geben Sie die XML-Datei an, die für die Gesichtsbeurteilung verwendet wird.
cascade_path = os.path.dirname(os.path.abspath(__file__)) + "/haarcascade_frontalface_alt2.xml"
class classifyPhoto:
def __init__(self):
print("init")
#Gesicht aus Bild ausschneiden, speichern, Pfad zurückgeben
def crop_face(self, img_path):
#Dateinamenanalyse
base_name = os.path.basename(img_path)
name,ext = os.path.splitext(base_name)
if (ext != '.jpg') and (ext != '.jpeg') :
print('not a jpg image')
return
img_src = cv2.imread(img_path, 1)
#In Graustufen konvertieren
img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
cascade = cv2.CascadeClassifier(cascade_path)
org_width = img_src.shape[1]
org_height = img_src.shape[0]
i = 0
for j in range(0,71):
#Erstellen eines vergrößerten Bildes
big_img = np.zeros((org_height * 2, org_width * 2 ,3), np.uint8)
big_img[ceil(org_height/2.0):ceil(org_height/2.0*3.0), ceil(org_width/2.0):ceil(org_width/2.0*3.0)] = img_src
#Mittelposition des Bildes
center = tuple(np.array([big_img.shape[1] * 0.5, big_img.shape[0] * 0.5]))
#Bildgröße abrufen(Seite,Vertikal)
size = tuple(np.array([big_img.shape[1], big_img.shape[0]]))
#Der Winkel, den Sie drehen möchten
angle = 5.0 * float(j)
#Expansionsverhältnis
scale = 1.0
#Berechnung der Rotationsumwandlungsmatrix
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
#Affin-Konvertierung
img_rot = cv2.warpAffine(big_img, rotation_matrix, size, flags=cv2.INTER_CUBIC)
rot_gray = cv2.cvtColor(img_rot, cv2.COLOR_BGR2GRAY)
#Gesichtsurteil
faces = cascade.detectMultiScale(img_rot, scaleFactor=1.2, minNeighbors=2, minSize=(50, 50))
#Wenn es ein Gesicht gibt
if len(faces) > 0:
for (x,y,w,h) in faces:
face = img_rot[y:y+h, x:x+w]
file_name = name + "_face_" + str(i) + ext
cv2.imwrite(temp_face_img_path + file_name, face )
i += 1
else :
print('does not have any faces')
return
if __name__ == '__main__':
classifier = classifyPhoto()
classifier.crop_faceo('image.jpg')
Es ist vielleicht besser, wenn Sie es einstellen, aber es wird wahrscheinlich nicht funktionieren.
Recommended Posts