dlib检测人脸关键的使用的是shape_predictor检测器,一般是搭配get_frontal_face_detector人脸检测器,但由于该人脸检测器不是很准,需要换成别的人脸检测器,这里以opencv自带的CascadeClassifier为例(这个检测器更不准,只是简单如何替换),以下是一个示例代码:
import dlib
import cv2
# 加载人脸检测器
detector = cv2.CascadeClassifier("path/to/haarcascade_frontalface_default.xml")
# 加载shape_predictor模型
predictor = dlib.shape_predictor("path/to/shape_predictor_68_face_landmarks.dat")
# 读取图片
img = cv2.imread("path/to/image.jpg")
# 将图片转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用OpenCV的人脸检测器检测人脸
faces = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 遍历每个检测到的人脸
for (x, y, w, h) in faces:
# 使用dlib的人脸关键点检测器检测人脸关键点
shape = predictor(img, dlib.rectangle(x, y, x + w, y + h))
# 遍历每个关键点并在图像上绘制圆圈
for i in range(68):
x = shape.part(i).x
y = shape.part(i).y
cv2.circle(img, (x, y), 2, (0, 255, 0), -1)
# 显示结果图像
cv2.imshow("Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例代码中,我们首先加载了OpenCV的人脸检测器,然后使用它来检测输入图像中的人脸。接着,我们使用dlib的shape_predictor模型来检测人脸关键点,并在图像上绘制圆圈来标记每个关键点的位置。最后,我们显示结果图像。