1. 程式人生 > >dlib 人臉特徵點檢測

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)        #等待按鍵,隨後退出

執行結果:

以下為標定的結果