0.引言
利用python开发,借助Dlib库进行人脸识别和人脸剪切;
源码介绍:
1.dlib_cut_faces.py : 识别图像中的多张人脸,然后并列窗口化显示
2.dlib_cut_faces_save.py:识别图像中的多张人脸,然后剪切保存到本地
图1 原图和dlib_cut_faces.py处理后得到的图像窗口
图2dlib_cut_faces_save.py处理后保存到本地的单张人脸图像
1. 开发环境
python:3.6.3
dlib: 19.7
opencv, numpy
1importdlib# 人脸识别的库dlib
2importnumpy as np# 数据处理的库numpy
3importcv2# 图像处理的库OpenCv
2.工程介绍
利用dlib进行人脸识别,dlib的使用比较简单,如下所示:
1detector =dlib.get_frontal_face_detector()
2
3#读取图像
3path ="F:/code/python/***/pic/"
4img = cv2.imread(path+"test.jpg")
5#print("img/shape:", img.shape)
6
7#dlib检测
8dets = detector(img, 1)
9print("人脸数:", len(dets))
然后就可以得到人脸的坐标,用来计算人脸矩形的高度和宽度:
1#计算要生成的图像img_blank大小
2fork, dinenumerate(dets):
3
4#计算矩形大小
5#(x,y), (宽度width, 高度height)
6pos_start =tuple([d.left(), d.top()])
7pos_end =tuple([d.right(), d.bottom()])
8
9#计算矩形框大小
10height = d.bottom()-d.top()
11width = d.right()-d.left()
(关于图像中高度height和宽度width的定义,如图3所示)
图3 图像高度height和宽度width的说明
得到人脸的高度和宽度之后,就可以根据新建相应大小矩形的空白图像:
1img_blank = np.zeros((height_max, width_sum, 3), np.uint8)
然后将从dlib检测到的人脸的坐标点开始,顺序写入空白图像中:
1foriinrange(height):
2forjinrange(width):
3img_blank[i][blank_start + j] = img[d.top() + i][d.left() + j]
这样得到的人脸就会存入空白图像img_blank中,如果你想保存到本地,达到图2的效果,那么现在就可以直接去将img_blank保存到你的目录下面:
1cv2.imwrite(path_save+"img_face_"+str(k+1)+".jpg", img_blank)
如果你想让人脸并排显示的话,稍微麻烦一点,需要遍历两次dets(for k, d in enumerate (dets)):
第一次遍历:记录下我们需要生成的图像窗口的大小,因为需要将多张照片显示在一张图像上,所以需要知道每张人脸照片的大小,我取的是高度最大值height_max和宽度之和width_sum;
图4 窗口图像尺寸
第二次遍历:根据之前得到的图像尺寸新建空白图像,然后开始用人脸矩形填充图像,每次width方向从blank_start位置开始,每次填完一张之后记得更新起始位置:
1#填充
2foriinrange(height):
3forjinrange(width):
4img_blank[i][blank_start+j] = img[d.top()+i][d.left()+j]
5#更新起始位置调整图像
6blank_start +=width
3. 结果
图5实现人脸识别和剪切
#可以在我的Github下载到源码: https://github.com/coneypo/Dlib_face_cut
# 请尊重他人劳动成果,转载或者使用源码请注明出处,谢谢
领取专属 10元无门槛券
私享最新 技术干货