[PYTHON] Machen Sie die Rotation der OpenCV-Objekterkennung unveränderlich

Die Merkmalsmenge der Haarkaskade ist nicht unveränderlich!

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.

Show FACES Image_screenshot_18.09.2015.jpg Auf diesem Foto hat nur Reni Takashiro, die geradeaus schaut, ihr Gesicht entdeckt.

Lösungen

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

  1. Laden Sie das Bild
  2. Bereiten Sie ein Luftbild mit der doppelten Höhe und Breite vor.
  3. Neigen Sie das geladene Bild nur um 5 Grad
  4. Fügen Sie das geneigte Bild in die Mitte des leeren Bildes ein
  5. Beurteile das Gesicht
  6. Wiederholen Sie die Schritte 2-5

In der Abbildung sieht es so aus 回転不変.001.jpg

Quellcode

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')

Ergebnis

回転不変.002.jpg

Erwägung

Es ist vielleicht besser, wenn Sie es einstellen, aber es wird wahrscheinlich nicht funktionieren.

Recommended Posts

Machen Sie die Rotation der OpenCV-Objekterkennung unveränderlich
Gesichtserkennung mit Python + OpenCV (invariante Rotation)
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Tool zum Erstellen von Trainingsdaten für die OpenCV-Objekterkennung
Versuchen Sie die Kantenerkennung mit OpenCV
Feature-Erkennung mit opencv (Eckenerkennung)
Echtzeit-Kantenerkennung mit OpenCV
Stellen Sie Opencv in Python zur Verfügung
Gesichtserkennung mit Python + OpenCV
Anime-Gesichtserkennung mit OpenCV