当前位置:网站首页>Dlib库实现人脸关键点检测(Opencv实现)
Dlib库实现人脸关键点检测(Opencv实现)
2022-06-30 17:20:00 【Keep_Trying_Go】
文章目录
1.dlib实现人脸实时检测
https://mydreamambitious.blog.csdn.net/article/details/124851743
2.dlib采用检测人脸的68个关键点

3.相关文件的下载
4.代码实战
(1)导入库
import os
import cv2
import dlib
import numpy as np
from collections import OrderedDict
(2)人脸关键点的整合
#对于68个检测点,将人脸的几个关键点排列成有序,便于后面的遍历
shape_predictor_68_face_landmark=OrderedDict([
('mouth',(48,68)),
('right_eyebrow',(17,22)),
('left_eye_brow',(22,27)),
('right_eye',(36,42)),
('left_eye',(42,48)),
('nose',(27,36)),
('jaw',(0,17))
])
(3)加载dlib库的人脸检测和人脸关键点检测文件
# 加载人脸检测与关键点定位
#http://dlib.net/python/index.html#dlib_pybind11.get_frontal_face_detector
detector = dlib.get_frontal_face_detector()
#http://dlib.net/python/index.html#dlib_pybind11.shape_predictor
criticPoints = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
(4)对人脸画框
#绘制人脸画矩形框
def drawRectangle(detected,frame):
margin = 0.2
img_h,img_w,_=np.shape(frame)
if len(detected) > 0:
for i, locate in enumerate(detected):
x1, y1, x2, y2, w, h = locate.left(), locate.top(), locate.right() + 1, locate.bottom() + 1, locate.width(), locate.height()
xw1 = max(int(x1 - margin * w), 0)
yw1 = max(int(y1 - margin * h), 0)
xw2 = min(int(x2 + margin * w), img_w - 1)
yw2 = min(int(y2 + margin * h), img_h - 1)
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
face = frame[yw1:yw2 + 1, xw1:xw2 + 1, :]
cv2.putText(frame, 'Person', (locate.left(), locate.top() - 10),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 0, 0), 3)
return frame
(5)对检测得到的人脸关键点坐标重新整理
#对检测之后获取的人脸关键点坐标进行转换
def predict2Np(predict):
# 创建68*2关键点的二维空数组[(x1,y1),(x2,y2)……]
dims=np.zeros(shape=(predict.num_parts,2),dtype=np.int)
#遍历人脸的每个关键点获取二维坐标
length=predict.num_parts
for i in range(0,length):
dims[i]=(predict.part(i).x,predict.part(i).y)
return dims
(6)对人脸的关键点绘制点
#遍历预测框,进行人脸的关键点绘制
def drawCriticPoints(detected,frame):
for (step,locate) in enumerate(detected):
#对获取的人脸框再进行人脸关键点检测
#获取68个关键点的坐标值
dims=criticPoints(frame,locate)
#将得到的坐标值转换为二维
dims=predict2Np(dims)
#通过得到的关键点坐标进行关键点绘制
# 从i->j这个范围内的都是同一个区域:比如上面的鼻子就是从27->36
for (name,(i,j)) in shape_predictor_68_face_landmark.items():
#对每个部位进行绘点
for (x,y) in dims[i:j]:
cv2.circle(img=frame,center=(x,y),
radius=2,color=(0,255,0),thickness=-1)
return frame
(7)整体代码
import os
import cv2
import dlib
import numpy as np
from collections import OrderedDict
#https://mydreamambitious.blog.csdn.net/article/details/123535760
#对于68个检测点,将人脸的几个关键点排列成有序,便于后面的遍历
shape_predictor_68_face_landmark=OrderedDict([
('mouth',(48,68)),
('right_eyebrow',(17,22)),
('left_eye_brow',(22,27)),
('right_eye',(36,42)),
('left_eye',(42,48)),
('nose',(27,36)),
('jaw',(0,17))
])
#绘制人脸画矩形框
def drawRectangle(detected,frame):
margin = 0.2
img_h,img_w,_=np.shape(frame)
if len(detected) > 0:
for i, locate in enumerate(detected):
x1, y1, x2, y2, w, h = locate.left(), locate.top(), locate.right() + 1, locate.bottom() + 1, locate.width(), locate.height()
xw1 = max(int(x1 - margin * w), 0)
yw1 = max(int(y1 - margin * h), 0)
xw2 = min(int(x2 + margin * w), img_w - 1)
yw2 = min(int(y2 + margin * h), img_h - 1)
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
face = frame[yw1:yw2 + 1, xw1:xw2 + 1, :]
cv2.putText(frame, 'Person', (locate.left(), locate.top() - 10),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 0, 0), 3)
return frame
#对检测之后获取的人脸关键点坐标进行转换
def predict2Np(predict):
# 创建68*2关键点的二维空数组[(x1,y1),(x2,y2)……]
dims=np.zeros(shape=(predict.num_parts,2),dtype=np.int)
#遍历人脸的每个关键点获取二维坐标
length=predict.num_parts
for i in range(0,length):
dims[i]=(predict.part(i).x,predict.part(i).y)
return dims
# 加载人脸检测与关键点定位
#http://dlib.net/python/index.html#dlib_pybind11.get_frontal_face_detector
detector = dlib.get_frontal_face_detector()
#http://dlib.net/python/index.html#dlib_pybind11.shape_predictor
criticPoints = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
#遍历预测框,进行人脸的关键点绘制
def drawCriticPoints(detected,frame):
for (step,locate) in enumerate(detected):
#对获取的人脸框再进行人脸关键点检测
#获取68个关键点的坐标值
dims=criticPoints(frame,locate)
#将得到的坐标值转换为二维
dims=predict2Np(dims)
#通过得到的关键点坐标进行关键点绘制
# 从i->j这个范围内的都是同一个区域:比如上面的鼻子就是从27->36
for (name,(i,j)) in shape_predictor_68_face_landmark.items():
#对每个部位进行绘点
for (x,y) in dims[i:j]:
cv2.circle(img=frame,center=(x,y),
radius=2,color=(0,255,0),thickness=-1)
return frame
#单张图片的人脸关键点检测
def signal_detect(img_path='images/face1.jpg'):
img=cv2.imread(img_path)
detected=detector(img)
frame=drawRectangle(detected,img)
frame = drawCriticPoints(detected, img)
cv2.imshow('frame',frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
#实时的人脸关键点检测
def detect_time():
cap=cv2.VideoCapture(0)
while cap.isOpened():
ret,frame=cap.read()
detected = detector(frame)
frame = drawRectangle(detected, frame)
frame=drawCriticPoints(detected,frame)
cv2.imshow('frame', frame)
key=cv2.waitKey(1)
if key==27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')
signal_detect()
# detect_time()
(9)单张图片的人脸关键点检测

注:实时检测部分读者可以自己测试。
边栏推荐
- EasyNVR平台设备通道均在线,操作出现“网络请求失败”是什么原因?
- AI首席架构师10-AICA-蓝翔 《飞桨框架设计与核心技术》
- The company was jailed for nonstandard bug during the test ~ [cartoon version]
- Php8.0 environment detailed installation tutorial
- Flink series: checkpoint tuning
- AI chief architect 10-aica-lanxiang, propeller frame design and core technology
- 云安全日报220630:IBM数据保护平台发现执行任意代码漏洞,需要尽快升级
- Vulnerability recurrence ----37. Apache unomi Remote Code Execution Vulnerability (cve-2020-13942)
- Only black-and-white box test is required for test opening post? No, but also learn performance test
- 「杂谈」对数据分析未来的几点思考
猜你喜欢

又一篇CVPR 2022论文被指抄袭,平安保险研究者控诉IBM苏黎世团队

Talk about the SQL server version of DTM sub transaction barrier function

Sword finger offer 16 Integer power of numeric value

Deep understanding of JVM (IV) - garbage collection (I)

The new Post-00 Software Test Engineer in 2022 is a champion

助力极致体验,火山引擎边缘计算最佳实践

漏洞复现----37、Apache Unomi 远程代码执行漏洞 (CVE-2020-13942)

LeetCode动态规划经典题(一)

countdownlatch 和 completableFuture 和 CyclicBarrier

Multipass中文文档-设置图形界面
随机推荐
C语言结构体
这里数据过滤支持啥样的sql语句
VS code 树视图 treeView
英飞凌--GTM架构-Generic Timer Module
漏洞复现----38、ThinkPHP5 5.0.23 远程代码执行漏洞
挑选智能音箱时,首选“智能”还是“音质”?这篇文章给你答案
Optimize with netcorebeauty Net core independent deployment directory structure
C language structure
ForkJoinPool
Deep understanding of JVM (II) - memory structure (II)
Vscode status bar statusbar
MRO工业品采购管理系统:赋能MRO企业采购各节点,构建数字化采购新体系
「杂谈」对数据分析未来的几点思考
Glacier teacher's book
Advanced customization of uni app [day13]
Classic problem of leetcode dynamic programming (I)
ASP. Net authentication code login
[PROJECT] Xiaomao school (IX)
Merged binary tree of leetcode
Vulnerability recurrence ----- 35. Uwsgi PHP directory traversal vulnerability (cve-2018-7490)
