OpenCV 检测人脸特征点(耳-下-耳线)
OpenCV detect face landmarks (ear-chin-ear line)
我正在寻找一个 opencv 函数(在 python 中)检测人脸上的左耳 - 下巴 - 右耳线(看起来像抛物线)。有没有什么 haarcascade 在做这项工作?我已经知道正面或眼睛 haarcascades 但我正在寻找更精确的东西。
您要找的是所谓的人脸界标检测。你可以试试 DLIB 。 DLIB 是用 C++ 编写的,但它也有一个 python 包装器 .Install Instructions
现在使用 DLib 你可以实现这个
代码
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()
结果
地标相关点数:
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))
还有一个易于使用的包装器 dlib called face_recognition。
from face_recognition import load_image_file, face_locations
# load to numpy array
img_array = load_image_file("img.jpg")
# returns a list with a dict for each face
# each face-dict contains landmarks for features like chin, nose.. etc
landmarks = face_locations(img_array)
我正在寻找一个 opencv 函数(在 python 中)检测人脸上的左耳 - 下巴 - 右耳线(看起来像抛物线)。有没有什么 haarcascade 在做这项工作?我已经知道正面或眼睛 haarcascades 但我正在寻找更精确的东西。
您要找的是所谓的人脸界标检测。你可以试试 DLIB 。 DLIB 是用 C++ 编写的,但它也有一个 python 包装器 .Install Instructions
现在使用 DLib 你可以实现这个
代码
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()
结果
地标相关点数:
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))
还有一个易于使用的包装器 dlib called face_recognition。
from face_recognition import load_image_file, face_locations
# load to numpy array
img_array = load_image_file("img.jpg")
# returns a list with a dict for each face
# each face-dict contains landmarks for features like chin, nose.. etc
landmarks = face_locations(img_array)