加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python3利用Dlib19.7实现人脸68个特征点标定

发布时间:2020-12-17 07:25:49 所属栏目:Python 来源:网络整理
导读:0.引言 利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68点标定,利用OpenCv进行图像化处理,在人脸上画出68个点,并标明序号; 实现的68个特征点标定功能如下图所示: 图1 人脸68个特征点的标定 1.开发环境 python:3.6.3 dlib:19.

0.引言

利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68点标定,利用OpenCv进行图像化处理,在人脸上画出68个点,并标明序号;

实现的68个特征点标定功能如下图所示:

图1 人脸68个特征点的标定 

1.开发环境

  python:3.6.3

  dlib:19.7

  OpenCv,numpy

需要调用的库: 

import dlib #人脸识别的库dlib
import numpy as np #数据处理的库numpy
import cv2 #图像处理的库OpenCv

2.设计流程

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

68点标定:

借助官方的Demo(face_landmark_detection.py,在之前另一篇博客里面介绍过学习Python3 Dlib19.7进行人脸面部识别)实现;

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.源码

# 68-points
# 2017-12-28
# By TimeStamp
# #cnblogs: http://www.cnblogs.com/AdaminXie/
import dlib      #人脸识别的库dlib
import numpy as np    #数据处理的库numpy
import cv2      #图像处理的库OpenCv

# dlib预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

path="********************"

# cv2读取图像
img=cv2.imread(path+"test.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):
  # 68点的坐标
  pos = (point[0,0],point[0,1])

  # 利用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),font,0.8,(0,255),1,cv2.LINE_AA)

cv2.namedWindow("img",2)
cv2.imshow("img",img)
cv2.waitKey(0) 

note:OpenCv的画图函数

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

    参数1:  img-          图片对象;

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

    参数3:  r-          半径;

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

   2. 输出字符 cv2.putText( img,"test",4,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)-   颜色数组;

    参数7:  2-        线宽thickness;

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

*关于 颜色数组:

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

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

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

结果:

图2 测试结果1 

  

图3 测试结果2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

  • Python人脸识别初探
  • Python+OpenCV人脸检测原理及示例详解
  • python利用OpenCV2实现人脸检测
  • python+opencv实现的简单人脸识别代码示例
  • python实现人脸识别代码
  • 详解如何用OpenCV + Python 实现人脸识别
  • python使用opencv进行人脸识别
  • Python 40行代码实现人脸识别功能
  • python结合opencv实现人脸检测与跟踪
  • python中使用OpenCV进行人脸检测的例子

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读