dlib 人脸特征点检测

人脸特征点检测(Facial landmark detection),即人脸特征点定位、人脸对齐,是在人脸检测的基础上进行的,对人类脸上的特征点(嘴角、眼角等)进行定位。

人脸特征点检测有诸多用途:

  1. 改善人脸识别:通过人脸特征点检测将人脸对齐到平均脸,对齐后的人脸图像识别算法更加有效。
  2. 人脸平均:利用人脸特征点检测的结果,将多个人脸进行融合,形成新的平均人脸。
  3. 人脸交换:利用人脸特征点检测的结果,对两张人脸进行无缝换脸,将一张人脸换到另一张人脸上。
  4. 人脸装扮:如美图秀秀、美颜相机等,对人脸进行化妆,都是在人脸特征点检测的基础上实现的。

本文用dlib实现人脸特征点检测,需要先下载dlib官方训练好的模型shape_predictor_68_face_landmarks.dat,下载链接为http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2。然后利用模型shape_predictor_68_face_landmarks.dat进行68点标定,利用OpenCv进行图像化处理,在人脸上画出68个点,并标明序号。

代码实现:

import numpy as np
import cv2                #图像处理库OpenCV
import dlib               #人脸识别库dlib
#dlib预测器
detector = dlib.get_frontal_face_detector()    #使用dlib库提供的人脸提取器
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')   #构建特征提取器

# cv2读取图像
img = cv2.imread("1.jpg")

# 取灰度
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

# 人脸数rects
rects = detector(img_gray, 0)
for i in range(len(rects)):
    landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])  #人脸关键点识别
    for idx, point in enumerate(landmarks):        #enumerate函数遍历序列中的元素及它们的下标
        # 68点的坐标
        pos = (point[0, 0], point[0, 1])
        print(idx,pos)

        # 利用cv2.circle给每个特征点画一个圈,共68个
        cv2.circle(img, pos, 5, color=(0, 255, 0))
        # 利用cv2.putText输出1-68
        font = cv2.FONT_HERSHEY_SIMPLEX
        #各参数依次是:图片,添加的文字,坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(img, str(idx+1), pos, font, 0.8, (0, 0, 255), 1,cv2.LINE_AA)

cv2.namedWindow("img", 2)     
cv2.imshow("img", img)       #显示图像
cv2.waitKey(0)        #等待按键,随后退出

运行结果:

以下为标定的结果

猜你喜欢

转载自blog.csdn.net/weixin_40277254/article/details/82115981