2016-07-09 23 views
0

Ich habe einen Algorithmus Viola-Jones in Python. Ich verwende haarcascade xml, die ich von openCV Root-Datei laden. Aber es gab keine XML-Datei für Mund und Nase in openCV, also habe ich diese Dateien von EmguCV heruntergeladen. Ergebnis für die Erkennung des Gesichts ist in Ordnung, aber die Erkennung des Auges ist nicht gut und die Nase mit dem Mund ist sehr schlecht. Ich habe versucht, Parameter in face_cascade.detectMultiScale zu ändern, aber es hat überhaupt nicht geholfen.Viola-Jones in Python mit OpenCV, Erkennung Mund und Nase


Mein Code:

import cv2 
import sys 

def facedet(img): 
    face_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_frontalface_default.xml') 
    eye_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_eye.xml') 
    mouth_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_mouth.xml') 
    nose_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_nose.xml') 

    img = cv2.imread(img) 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

    faces = face_cascade.detectMultiScale(gray, 1.3, 5) 

    for (x,y,w,h) in faces: 
     cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2) 
     roi_gray = gray[y:y+h, x:x+w] 
     roi_color = img[y:y+h, x:x+w] 
     eyes = eye_cascade.detectMultiScale(roi_gray) 
     nose = nose_cascade.detectMultiScale(roi_gray) 
     mouth = mouth_cascade.detectMultiScale(roi_gray) 

     for (ex,ey,ew,eh) in eyes: 
      cv2.rectangle(roi_color, (ex,ey), (ex+ew, ey+eh), (0,255,0), 2) 
     for (nx, ny, nw, nh) in nose: 
      cv2.rectangle(roi_color, (nx, ny), (nx + nw, ny + nh), (0, 0, 255), 2) 
     for (mx, my, mw, mh) in mouth: 
      cv2.rectangle(roi_color, (mx, my), (mx + mw, my + mh), (0, 0, 0), 2) 

    cv2.namedWindow('image', cv2.WINDOW_NORMAL) 
    cv2.imshow('image',img) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows() 


if __name__ == '__main__': 
    #img = sys.argv[1] 
    facedet(img) 

Meine Frage

Was mache ich falsch? Gibt es eine einfache Lösung, die mir ein besseres Ergebnis bringt?


Output:

enter image description here

enter image description here

enter image description here

enter image description here

+0

Nur eine Anmerkung: Sind diese Fotos öffentlich? Gehören sie dir? Andernfalls entfernen Sie bitte. – Berriel

+0

Fotos sind öffentlich verfügbar, heruntergeladen von http://ibug.doc.ic.ac.uk/resources/facial-point-annotations/. – Kattynka

Antwort

2

Haar c ascades funktionieren gut für Gesichter, aber nicht so gut für kleinere Einzelteile. Eine bessere Lösung besteht darin, alle Gesichtsmarkierungen zusammen zu erfassen. Ein guter Algorithmus dafür ist "Eine Millisekunden-Gesichtsausrichtung mit einem Ensemble von Regressionsbäumen von Vahid Kazemi und Josephine Sullivan, CVPR 2014", die in Dlib (http://dlib.net/face_landmark_detection.py.html) implementiert ist.

0

Import cv2 import sys

face_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_frontalface_default.xml') 
eye_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_eye.xml') 
mouth_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_mouth.xml') 
nose_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_nose.xml') 

img = cv2.imread(img) 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

faces = face_cascade.detectMultiScale(gray, 1.3, 5) 

for (x,y,w,h) in faces: 
    cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2) 
    roi_gray = gray[y:y+h, x:x+w] 
    roi_color = img[y:y+h, x:x+w] 
    eyes = eye_cascade.detectMultiScale(gray, 1.3, 5) 
    nose = nose_cascade.detectMultiScale(gray, 1.3, 5) 
    mouth = mouth_cascade.detectMultiScale(gray, 1.7, 11) 

    for (ex,ey,ew,eh) in eyes: 
     cv2.rectangle(img, (ex,ey), (ex+ew, ey+eh), (0,255,0), 2) 
    for (nx, ny, nw, nh) in nose: 
     cv2.rectangle(img, (nx, ny), (nx + nw, ny + nh), (0, 0, 255), 2) 
    for (mx, my, mw, mh) in mouth: 
     cv2.rectangle(img, (mx, my), (mx + mw, my + mh), (0, 0, 0), 2) 

cv2.namedWindow('image', cv2.WINDOW_NORMAL) 
cv2.imshow('image',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Sie diesen Code ausprobieren können. Es hat für mich funktioniert.