python3利用Dlib19.7实现人脸68个特征点标定
Python  /  管理员 发布于 6年前   167
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 #人脸识别的库dlibimport numpy as np #数据处理的库numpyimport 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 #人脸识别的库dlibimport numpy as np #数据处理的库numpyimport 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)# 人脸数rectsrects = 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), pos, font, 0.8, (0, 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,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()函数中的 半径、线宽 等参数使得输出满足需求方便查看;
结果:
图2 测试结果1
图3 测试结果2
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号