dlib 人臉特徵點檢測
阿新 • • 發佈:2019-01-11
人臉特徵點檢測(Facial landmark detection),即人臉特徵點定位、人臉對齊,是在人臉檢測的基礎上進行的,對人類臉上的特徵點(嘴角、眼角等)進行定位。
人臉特徵點檢測有諸多用途:
- 改善人臉識別:通過人臉特徵點檢測將人臉對齊到平均臉,對齊後的人臉影象識別演算法更加有效。
- 人臉平均:利用人臉特徵點檢測的結果,將多個人臉進行融合,形成新的平均人臉。
- 人臉交換:利用人臉特徵點檢測的結果,對兩張人臉進行無縫換臉,將一張人臉換到另一張人臉上。
- 人臉裝扮:如美圖秀秀、美顏相機等,對人臉進行化妝,都是在人臉特徵點檢測的基礎上實現的。
本文用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) #等待按鍵,隨後退出
執行結果:
以下為標定的結果