Python 3.6.3 利用 Dlib 19.7 和 opencv 实现人脸68点定位 进行人脸识别

时间:2017-12-28 21:41:34   收藏:0   阅读:4546

0.引言

   介绍利用Dlib官方给的人脸识别预测器“shape_predictor_68_face_landmarks.dat”进行68点标定,利用OpenCv进行图像化处理,在人脸上画出68个点,并标明序号。

 

1.开发环境

  python:  3.6.3

  dlib:    19.7

  OpenCv, PIL, numpy

  需要调用的库: 

1 import dlib                     #人脸识别的库dlib
2 from PIL import Image           #图像处理的库PIL 
3 import numpy as np              #数据处理的库numpy
4 import cv2                      #图像处理的库OpenCv

 

2.设计流程

  工作内容主要以下两大块68点标定 OpenCv绘点

    68点标定:

      借助官方的Demo(face_landmark_detection.py,在之前另一篇博客里面介绍过http://www.cnblogs.com/AdaminXie/p/7905888.html)实现;

    OpenCv绘点:

      介绍了用到的 画圆函数cv2.circle() 输出字符串函数 cv2.putText() ;

 

  流程

  1.调用dlib库来进行人脸识别,调用预测器“shape_predictor_68_face_landmarks.dat”进行68点标定

  2.存入68个点坐标

  3.利用cv2.circle来画68个点

  4.利用cv2.putText()函数来画数字1-68

 

3.源码

 

 1 #68-points
 2 #2017-12-28
 3 #By TimeStamp
 4 # #cnblogs: http://www.cnblogs.com/AdaminXie/
 5 
 6 import dlib
 7 from PIL import Image
 8 import numpy as np
 9 import cv2
10 
11 # dlib预测器
12 detector = dlib.get_frontal_face_detector()
13 predictor = dlib.shape_predictor(shape_predictor_68_face_landmarks.dat)
14 
15 # cv2处理图像
16 img_cv2 = cv2.imread("test4.jpg")
17 
18 # PIL处理图像
19 img_PIL = Image.open("test4.jpg").convert(RGBA)
20 
21 # 灰度
22 img_gray = np.array(img_PIL.convert(L))
23 
24 rects = detector(img_gray, 0)
25 
26 # 人脸数
27 for i in range(len(rects)):
28     landmarks = np.matrix([[p.x, p.y] for p in predictor(img_cv2, rects[i]).parts()])
29     img_cv2 = img_cv2.copy()
30 
31     for idx, point in enumerate(landmarks):
32         pos = (point[0, 0], point[0, 1])
33 
34         # 利用cv2.circle给每个特征点画一个圈,共68个
35         cv2.circle(img_cv2, pos, 5, color=(0, 255, 0))
36 
37         # 利用cv2.putText输出1-68
38         font = cv2.FONT_HERSHEY_SIMPLEX
39         cv2.putText(img_cv2, str(idx+1), pos, font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
40 
41 cv2.namedWindow("img_cv2", 2)
42 cv2.imshow("img_cv2", img_cv2)
43 cv2.waitKey(0)

 

 

note:OpenCv的画图函数

  1. 画圆 cv2.circle( img, (p1,p2), r, (255,255,255) )

    参数1:  img-          图片对象;

    参数2:  (p1,p2)-          圆心坐标;

    参数3:  r-          半径;

    参数4:  (255,255,255)-  颜色数组; 

 

   2. 输出字符 cv2.putText( img,"test", (p1,p2), font, 4, (255,255,255), 2, cv2, LINE_AA )

    参数1:  img-      图像对象;

    参数2:  "test"-      需要打印的字符text(数字的话可以利用str()转成字符);

    参数3:  (p1,p2)-      坐标textOrg;

    参数4:  font-      字体fontFace(注意这里 font = cv2.FONT_HERSHEY_SIMPLEX);

    参数5:  4-       字号fontScale;

    参数6:  (255,255,255)-   颜色数组;

    参数7:  2-        线宽thickness;

    参数8:  LINE_AA-      线条种类line_type;

    

    *关于 颜色数组

      (255,255,255), (蓝色绿色红色),每个值都是0-255;

      比如:蓝色(255,0,0),紫色(255,0,255)

    

    可以调整cv2.circle()函数和cv2.putText()函数中的 半径、线宽 等参数使得输出满足需求方便查看;

 

结果:

技术分享图片

图1 测试结果1

 

技术分享图片

 图2 测试结果2

 

附件:

shape_predictor_68_face_landmarks.dat(Dlib官方的人脸识别68个特征点标定模型)
(链接: https://pan.baidu.com/s/1kVgnpwb 密码: acmk)

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!