您的位置:首页 > 运维架构

opencv4.2+dlib实现脸部关键点检测

2020-07-13 06:02 1341 查看

使用opencv4.2、dlib、python模块进行脸部关键点检测

1、环境配置

        我的硬件配置是windows10 + i7-9700kf + anaconda,具体关于anaconda的安装就不细说了。
首先使用conda创建一个新的虚拟环境,conda create -n python_dlib python==3.6,然后激活python_dlib环境之后,直接进行pip install dlib opencv-python,pip install dlib,关于dlib如果你是想用GPU版本的,那你就需要去进行源码的编译了,手动开启GPU接口。

2、代码实现

在代码实现之前,你首先准备好这个已经训练好的模型,https://download.csdn.net/download/weixin_43871135/12507063

# Author by Mr.Wang .
# csdn_url :  https://blog.csdn.net/weixin_43871135
import dlib
import numpy as np
import cv2

camera_path = 0  # 视频输入来源

cap = cv2.VideoCapture(camera_path)  # opencv读取视频
model_path = 'shape_predictor_81_face_landmarks.dat'  # 脸部关键点的模型的地址

detect_face = dlib.get_frontal_face_detector()  # 引入dlib的人脸检测模块
predictor = dlib.shape_predictor(model_path)  # 加载模型

while True:
ret, frame = cap.read()  # 逐帧读取
if ret:
dets = detect_face(frame, 0)  # 人脸检测,参数为0,不实现放大,
#  参数为1,则放大图像进行检测,检测小脸
for face, det_point in enumerate(dets):  # 对检测到的每一张脸进行操作
#   face为第几张脸, det_point为检测到的脸的第坐标
shape = predictor(frame, det_point)  # 对输入的脸进行关键点检测
landmarks = np.array([[p.x, p.y] for p in shape.parts()])  # 关键点的坐标
for num in range(shape.num_parts):  # 对返回的关键点进行画图
cv2.circle(frame, (shape.parts()[num].x, shape.parts()[num].y), 3, (0, 255, 0), -1)

# cv2.circle(frame, (shape.parts()[num].x, shape.parts()[num].y), 5, color=(0, 0, 255))
if num == 1 or num == 2 or num == 14 or num == 15:  ## 我这里是做了一个判断,大概的标出耳朵的位置
cv2.circle(frame, (shape.parts()[num].x, shape.parts()[num].y), 3, (0, 0, 255), -1)
cv2.putText(frame, str(num + 1), (shape.parts()[num].x, shape.parts()[num].y),
cv2.FONT_HERSHEY_SIMPLEX,
0.8, (0, 0, 255), 1, cv2.LINE_AA)

cv2.imshow('frame', frame)
if cv2.waitKey(1) == 27:
break

cap.release()  # 资源释放
cv2.destroyAllWindows()  # 窗口销毁

3、效果展示

图1 戴眼镜
图2 不戴眼镜

有一说一,不吹不黑,dlib的检测效果还不是很好,侧脸基本都检测不出来,并且戴眼镜和不带眼睛的检测效果也是有点区别的,不过这只是个demo,如果要是真正应用的话,还是得卷积网络才能搞定。你说呢?

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