2016-05-13 1 views
2

Je cherche une fonction opencv (en python) détectant la ligne oreille gauche - menton - oreille droite (qui ressemble à un parabol) sur les visages humains. Y a-t-il une sorte de hacascascade qui fait ce travail? Je connais déjà le visage frontal ou les yeux haarcascadés mais je cherche quelque chose de plus précis.OpenCV détecter les repères de visage (ligne oreille-menton-oreille)

Répondre

5

Ce que vous cherchez est appelé détection de point de repère. Vous pouvez essayer DLIB. DLIB est écrit en C++ mais il a aussi un wrapper python. Install Instructions

Maintenant, en utilisant Dlib vous pouvez réaliser ce

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

Résultats

enter image description here

Points liés à point de repère:

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

merci c'était exactement ce que je cherchais! – fonfonx

+0

Néanmoins, j'obtiens une erreur sur la ligne 'rect = dlib.rectangle (x, y, x + w, y + h)' qui est 'Boost.Python.ArgumentError: types d'arguments Python dans le rectangle .__ init __ (rectangle, numpy .int32, numpy.int32, numpy.int32, numpy.int32) ne correspond C++ signature: __init __ (_ * objet, à long gauche, haut long, à long droite, longue en bas) __init __ (objet _ *) ' Avez vous avez déjà cette erreur et savez comment la réparer? – fonfonx

+0

Je n'ai eu aucune erreur exactement comme ceci mais j'ai fait face à beaucoup de problèmes et ai trouvé cette solution et cela a fonctionné. :/vous avez le bon chemin vers la cascade ?? et le prédicteur ?? – Arijit