<>人脸特征提取
本文主要使用dlib库中的人脸特征识别功能。
dlib库使用68个特征点标注出人脸特征,通过对应序列的特征点,获得对应的脸部特征。下图展示了68个特征点。比如我们要提
取眼睛特征,获取37到46这几个特征点即可。
在代码中增加类似的映射,直接通过调用对应部位。
Python学习交流Q群:906715085##3 FACIAL_LANDMARKS_68_IDXS = OrderedDict([ ("mouth", (
48, 68)), ("right_eyebrow", (17, 22)), ("left_eyebrow", (22, 27)), ("right_eye",
(36, 42)), ("left_eye", (42, 48)), ("nose", (27, 36)), ("jaw", (0, 17))])
FACIAL_LANDMARKS_5_IDXS= OrderedDict([ ("right_eye", (2, 3)), ("left_eye", (0, 1
)), ("nose", (4))
<>数据预处理与模型加载
我们按照输入图像的要求对图像进行变形处理,这里需要转化为灰度图,加载get_frontal_face_detector模型和特征库进行检测。
Python学习交流Q群:906715085### #加载人脸检测与关键点定位 detector = dlib.
get_frontal_face_detector() predictor = dlib.shape_predictor(args[
"shape_predictor"]) #读取输入数据,预处理 image = cv2.imread(args["image"]) (h, w) = image
.shape[:2] width=500 r = width / float(w) dim = (width, int(h * r)) image = cv2.
resize(image, dim, interpolation=cv2.INTER_AREA) gray = cv2.cvtColor(image, cv2.
COLOR_BGR2GRAY) #人脸检测rects = detector(gray, 1)
<>遍历每个脸部关键点
对提取出来的人脸进行特征点预测,对人脸关键部位进行定位,同时将其转化为np_array的形式。
shape = predictor(gray, rect) shape = shape_to_np(shape)
遍历每一个部分,复制一个副本进行操作,将当前检测的类别标识在图像上。
#遍历每一个部分 for (name, (i, j)) in FACIAL_LANDMARKS_68_IDXS.items(): clone = image.
copy() cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0,
255), 2)
根据识别出来的位置,将特征点画在图像上。
for (x, y) in shape[i:j]: cv2.circle(clone, (x, y), 3, (0, 0, 255), -1)
提取出该五官部位。
(x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]])) roi = image[y:y + h, x:
x+ w] (h, w) = roi.shape[:2] width=250 r = width / float(w) dim = (width, int(h
* r)) roi = cv2.resize(roi, dim, interpolation=cv2.INTER_AREA)
最后展示出来即可。
cv2.imshow("ROI", roi) cv2.imshow("Image", clone) cv2.waitKey(0)
最终效果
原图
脸部检测
全部五官检测
关键部位检测