人脸识别的前提肯定是先得找到图像中的人脸,再经过其它方法进行人脸的识别,这篇就来总结下如何进行人脸的检测。
本章代码以图片为例,如果想要实现视频人脸实时检测追踪,只需加入读入视频,然后检测帧图片即可。
本章代码有参考和引用,但是不记得原博了,原谅啦~~
(文中有帅哥!!!哈哈哈哈 我是个小花痴,鉴定完毕! )
1. dlib
如果你了解过一点点人脸检测,那dlib肯定就不陌生了。具体不介绍,只需要在环境中安装dlib(pip install dlib),这种安装一定不陌生啦~~
直接上运用代码:
# -*- coding: utf-8 -*-
import sys
import dlib
import cv2
faces_path = "./data/ma2.jpg"
detector = dlib.get_frontal_face_detector() #人脸分类器
predictor_path = "./data/shape_predictor_68_face_landmarks.dat" #别忘记下载这里导入的文件
predictor = dlib.shape_predictor(predictor_path) #特征提取器
# opencv 读取图片,并显示
img = cv2.imread(faces_path, cv2.IMREAD_COLOR)
b, g, r = cv2.split(img) # 分离三个颜色通道
img2 = cv2.merge([r, g, b]) # 融合三个颜色通道生成新图片
dets = detector(img, 1) #使用detector进行人脸检测 dets为返回的结果
print("Number of faces detected: {}".format(len(dets)))
sp = img2.shape
height=sp[0]
width=sp[1]
for index, face in enumerate(dets):
shape = predictor(img, face) #使用predictor进行人脸关键点识别
miny=height
maxy=0
middleX=shape.part(30).x #鼻子中心点
for i in range(0,68):
print("第%d个点: x=%d y=%d\r\n"%(i,shape.part(i).x,shape.part(i).y))
if shape.part(i).y<miny:
miny=shape.part(i).y
if shape.part(i).y>maxy:
maxy=shape.part(i).y
#计算人脸外框
deltaY=maxy-miny;
deltaY1=0.9*deltaY
deltaY2=0.5*0.9*deltaY
deltaX=(deltaY+deltaY1+deltaY2)*3/8
left = int(middleX-deltaX)
right=int(middleX+deltaX)
top=int(miny-deltaY1)+10
bottom=int(maxy+deltaY2)+10
# 在图片中标注人脸显示
cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 3)
cv2.namedWindow(faces_path, cv2.WINDOW_AUTOSIZE)
cv2.imshow(faces_path, img)
cv2.waitKey(0)
cv2.destroyAllWind