您的位置:首页 > 编程语言 > Python开发

python+OpenCv+dlib实现人脸68个关键点检测并标注

2018-02-10 12:13 1146 查看
寒假跟着老师做科技部的项目,主要做微表情的检测。刚开始一头雾水,在研究了两天之后,渐渐找到了一点感觉。 ——这里主要实现了利用python3.6 + OpenCV + dlib 实现人脸68个关键点检测并标注

python3.6下dlib的配置

利用提供的训练模型进行人脸检测

使用OpenCV进行标注

python3.6 下 dlib 的配置

dlib在python下的配置反反复复一直在折腾,一会说编码错误,一会又查资料说需要安装编译boost和Cmake等其他软件环境。反复查找资料后,这里给出一种简单快速地安装方法,不需要安装编译boost和Cmake等其他软件环境。

对应Anaconda的安装在这里不是重点,就不多说了。没有安装过的可以去找度娘。

第一步

使用Anaconda创建一个Python版本为3.6的Python环境。



第二步

在终端中打开环境。



第三步

输入:

pip install dlib==19.7.0

注意:直接输入安装dlib可能会出错,因为可能最新版无whl格式的安装包,所以建议安装19.7.0版本,可以跳过安装boost和Cmake。

等待安装成功!

人脸检测 + 标注

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

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



设计流程

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

68点标定:

借助官方的训练模型实现;

dlib中为我们提供了关于人脸检测标注训练好的文件可在http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2下载

(下载完成后解压到工程目录下)

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

程序展示

# _*_ coding:utf-8 _*_

import numpy as np
import
8be8
cv2
import dlib

detector = dlib.get_frontal_face_detector()
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):
# 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)


结果展示





作者 @culeao

2018 年 02月 08日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: