2016-05-13 2 views
2

Я ищу функцию opencv (в python), обнаруживающую линию левого уха - подбородок - правое ухо (похожее на парабол) на человеческих лицах. Есть ли какой-нибудь хааркаскад, выполняющий эту работу? Я уже знаю лобное лицо или глаза haarcascades, но я ищу что-то более точное.OpenCV обнаруживает ориентиры лица (линия уха-подбородок)

ответ

5

То, что вы ищете, называется распознаванием ориентира лица. Вы можете попробовать DLIB. DLIB написан на C++, но также имеет оболочку python. Install Instructions

Теперь с помощью DLib вы можете достичь этой

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

Результаты

enter image description here

Очки, связанные с ориентир:

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

спасибо, что это именно то, что я искал! – fonfonx

+0

Тем не менее, я получаю ошибку в строке 'rect = dlib.rectangle (x, y, x + w, y + h)', которая является 'Boost.Python.ArgumentError: типы аргументов Python в прямоугольник .__ init __ (rectangle, numpy .int32, numpy.int32, numpy.int32, numpy.int32) не соответствует C++ подпись: __init __ (_ объект *, длинный левый, длинный верх, длинный правый, нижний длинный) __init __ (_ объект *) ' ли вы уже получили эту ошибку и знаете, как ее исправить? – fonfonx

+0

У меня не было такой ошибки, но я столкнулся с множеством проблем и придумал это решение, и это сработало. :/у вас есть правильный путь к каскаду ?? и предиктором ?? – Arijit

Смежные вопросы