需要工具包:numpy
,cv2
,dlib
dlib在做人脸识别方面非常好用,我们使用dlib提供的现成的训练集来对模型进行训练。
网盘链接
提取码:rn0n
如果对dlib工具包安装有问题的,请移步win10 64 位系统python3.7 安装dlib包
对opencv工具包安装有问题的,请移步小白安装opencv-python
import cv2
import numpy as np
import dlib
font= cv2.FONT_HERSHEY_SIMPLEX #搞定汉字
#获得人脸矩形的坐标信息,用来画矩形框
def rect_size(rect):
x=rect.left()
y=rect.top()
w=rect.right()-x
h=rect.bottom()-y
return(x,y,w,h)
#将包含68个特征点的shape转换为ndarry格式,因为初始的shape并不是列表的格式
def shape_np(shape):
a=np.zeros((68,2),dtype='int')
for i in range(0,68):
a[i]=(shape.part(i).x,shape.part(i).y)
return a
#将检测到的image规格化大小,避免出现太大的情况
def resize(image,width=500):
r=width*1.0/image.shape[1]
dim=(width,int(image.shape[0]*r))
image_re=cv2.resize(image,dim,interpolation=cv2.INTER_AREA)
return image_re
#主函数
def main():
img=cv2.imread('D://zopencv//renqun.jpg')
img=resize(img,width=500)
#加载人脸检测和关键点定位
detector=dlib.get_frontal_face_detector()
#训练集需要自己下载
predictor=dlib.shape_predictor('D://mypro//shape_predictor_68_face_landmarks.dat')
#转化成灰度图
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#得到所有用矩形标示的人脸的坐标
rects=detector(img_gray,1)
# print(rects)
#提前创建一个空的shape列表
shapes=[]
for i,rect in enumerate(rects):#enmerate函数可以返回列表元素的索引和数值
shape=predictor(img_gray,rect)#得到特征点的位置
shape=shape_np(shape)
shapes.append(shape)
(x,y,w,h)=rect_size(rect)
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)#画框住人脸的矩形
#填加文字,表示这是第几张脸
cv2. cv2.putText(img, "Face: {}".format(i + 1), (x - 10, y - 10), font, 0.5, (255, 255, 0), 2)
#画出特征点的位置
for shape in shapes:
for (x,y) in shape:
cv2.circle(img,(x,y),1,(255,255,0),-1)
cv2.imshow('feature',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__=='__main__':
main()
我爱热巴