前面说了怎么打开摄像头框出人脸,接下来学习了一下人脸的68个特征点
直接代码
import dlib
import cv2
# 与人脸检测相同,使用dlib自带的frontal_face_detector作为人脸检测器
detector = dlib.get_frontal_face_detector()
# 使用官方提供的模型构建特征提取器
predictor = dlib.shape_predictor('E:data/shape_predictor_68_face_landmarks.dat/shape_predictor_68_face_landmarks.dat')
# cv2读取图片
img = cv2.imread("D:/2.0/progect/my_faces0/103.jpg")
# 与人脸检测程序相同,使用detector进行人脸检测 dets为返回的结果
dets = detector(img, 1)
# 使用enumerate 函数遍历序列中的元素以及它们的下标
# 下标k即为人脸序号
# left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离
# top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
for k, d in enumerate(dets):
print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
k, d.left(), d.top(), d.right(), d.bottom()))
# 使用predictor进行人脸关键点识别 shape为返回的结果
shape = predictor(img, d)
# 获取第一个和第二个点的坐标(相对于图片而不是框出来的人脸)
print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
# 绘制特征点
for index, pt in enumerate(shape.parts()):
print('Part {}: {}'.format(index, pt))
pt_pos = (pt.x, pt.y)
cv2.circle(img, pt_pos, 1, (255, 0, 0), 2)
#利用cv2.putText输出1-68
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, str(index+1),pt_pos,font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow('img', img)
k = cv2.waitKey()
cv2.destroyAllWindows()
参考该博主的代码,可识别一张图片上的人脸,下面放一张颖宝和峰峰某剧里面的一张照片
运行代码后,为了不影响美观,我已经把人脸框去掉了,只剩下特征点和编码
好精致的五官呐!~~
将上面的代码稍作修改,现将要识别的图片换成含有人脸的视频,将会识别视频中的人脸,代码如下:
import cv2
import dlib
predictor_path = "E:data/shape_predictor_68_face_landmarks.dat/shape_predictor_68_face_landmarks.dat"
#初始化
predictor = dlib.shape_predictor(predictor_path)
#初始化dlib人脸检测器
detector = dlib.get_frontal_face_detector()
#初始化窗口
win = dlib.image_window()
cap = cv2.VideoCapture('H:/2.mp4')
#cap = cv2.VideoCapture(0)
while cap.isOpened():
ok, cv_img = cap.read()
if not ok:
break
img = cv2.cvtColor(cv_img, cv2.COLOR_RGB2BGR)#转灰
dets = detector(img, 0)
shapes =[]
for k, d in enumerate(dets):
print("dets{}".format(d))
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
k, d.left(), d.top(), d.right(), d.bottom()))
# 使用predictor进行人脸关键点识别 shape为返回的结果
shape = predictor(img, d)
#shapes.append(shape)
#绘制特征点
for index, pt in enumerate(shape.parts()):
print('Part {}: {}'.format(index, pt))
pt_pos = (pt.x, pt.y)
cv2.circle(img, pt_pos, 1, (0,225, 0), 2)
# 利用cv2.putText输出1-68
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, str(index+1),pt_pos,font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
win.clear_overlay()
win.set_image(img)
if len(shapes)!= 0 :
for i in range(len(shapes)):
win.add_overlay(shapes[i])
# win.add_overlay(dets)
cap.release()
修改视频路径
cap = cv2.VideoCapture('H:/2.mp4')# 注:此处为视频路径
效果图
截取了一小部分视频做成GIF图,效果还不错,原始图片和视频均来自于网络,侵权删。
如果想把视频换成摄像头直接获取的视频则需要把视频路径那一行代码注释掉,换成下面的代码即可
# cap = cv2.VideoCapture('H:/2.mp4')
cap = cv2.VideoCapture(0)
这样就可以直接进行实时动态监测脸部特征了。
在实验的过程中,我把人脸框的代码注释掉了(主要是太丑o(╥﹏╥)o),想尝试的朋友可以将倒数第二行的注释去掉,人脸框就出来啦~
还要感谢另一位博主啦,这些都是在他们的基础上完成的。