2016-05-13 17 views
2

Ich bin auf der Suche nach einer Opencv-Funktion (in Python) Erkennung der Linie linkes Ohr - Kinn - rechtes Ohr (das wie ein Parabol aussieht) auf menschlichen Gesichtern. Gibt es irgendeine Art von Haarkascade, die diesen Job macht? Ich kenne das Frontalgesicht oder die Augen Haarkaskaden, aber ich suche nach etwas genauerem.OpenCV erkennen Gesichtspunkte (Ohr-Kinn-Ohr-Linie)

Antwort

5

was Sie suchen, heißt Gesicht Wahrzeichen Erkennung. Sie können DLIB versuchen. DLIB ist in C++ geschrieben, hat aber auch einen Python-Wrapper. Install Instructions

Jetzt DLIB verwenden Sie dies zu Wahrzeichen im Zusammenhang

-Code

import cv2 
import dlib 
import numpy 

PREDICTOR_PATH = "/home/zed/dlib/files/shape_predictor_68_face_landmarks.dat" 
predictor = dlib.shape_predictor(PREDICTOR_PATH) 
cascade_path='haarcascade_frontalface_default.xml' 
cascade = cv2.CascadeClassifier(cascade_path) 

# #This is using the Dlib Face Detector . Better result more time taking 
# def get_landmarks(im): 
#  rects = detector(im, 1) 
#  rect=rects[0] 
#  print type(rect.width()) 
#  fwd=int(rect.width()) 
#  if len(rects) == 0: 
#   return None,None 

#  return np.matrix([[p.x, p.y] for p in predictor(im, rects[0]).parts()]),fwd 

def get_landmarks(im): 
    rects = cascade.detectMultiScale(im, 1.3,5) 
    x,y,w,h =rects[0] 
    rect=dlib.rectangle(x,y,x+w,y+h) 
    return numpy.matrix([[p.x, p.y] for p in predictor(im, rect).parts()]) 

def annotate_landmarks(im, landmarks): 
    im = im.copy() 
    for idx, point in enumerate(landmarks): 
     pos = (point[0, 0], point[0, 1]) 
     cv2.putText(im, str(idx), pos, 
        fontFace=cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 
        fontScale=0.4, 
        color=(0, 0, 255)) 
     cv2.circle(im, pos, 3, color=(0, 255, 255)) 
    return im 

im=cv2.imread('face_leo1.jpg') 
cv2.imshow('Result',annotate_landmarks(im,get_landmarks(im))) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Ergebnisse

enter image description here

Punkte erreichen können:

FACE_POINTS = list(range(17, 68)) 
MOUTH_POINTS = list(range(48, 61)) 
RIGHT_BROW_POINTS = list(range(17, 22)) 
LEFT_BROW_POINTS = list(range(22, 27)) 
RIGHT_EYE_POINTS = list(range(36, 42)) 
LEFT_EYE_POINTS = list(range(42, 48)) 
NOSE_POINTS = list(range(27, 35)) 
JAW_POINTS = list(range(0, 17)) 
CHIN_POINTS=list(range(6,11)) 
+0

danke das war genau das was ich gesucht habe! – fonfonx

+0

Trotzdem bekomme ich einen Fehler bei der Zeile 'rect = dlib.rectangle (x, y, x + w, y + h)' was 'Boost.Python.ArgumentError: Python Argumenttypen in Rechteck .__ Init __ (Rechteck, numpy .int32, numpy.int32, numpy.int32, numpy.int32) nicht C++ Signatur entspricht: __init __ (_ Objekt *, lange links, lange spitze, lange rechts, lange unten) __init __ (_ Objekt *) ' Did Sie haben diesen Fehler bereits und wissen, wie Sie ihn beheben können? – fonfonx

+0

Ich hatte keinen Fehler genau so, aber ich hatte viele Probleme und kam mit dieser Lösung und es funktionierte. :/Sie haben den richtigen Weg zu kaskaden? und der Prädiktor? – Arijit

Verwandte Themen