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)
2
A
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
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))
merci c'était exactement ce que je cherchais! – fonfonx
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
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