Dlib实现人脸检测和剪切

参考:https://www.cnblogs.com/AdaminXie/p/8339863.htmlhtml

代码:python

# -*- coding: UTF-8 -*-
"""
将指定目录下的全部图片的人脸抠出
"""
import dlib         # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2          # 图像处理的库OpenCv
import os

# dlib预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

# 读取图像的路径
path_read = "D:/test-2018-08-05/test"

for file_name in os.listdir(path_read):
	#aa是图片的全路径
    aa=(path_read +"/"+file_name)
    #读入的图片的路径中含非英文
    img=cv2.imdecode(np.fromfile(aa, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
    #获取图片的宽高
    img_shape=img.shape
    img_height=img_shape[0]
    img_width=img_shape[1]
   
    # 用来存储生成的单张人脸的路径
    path_save="D:/test-2018-08-05/test-results"

    # dlib检测
    dets = detector(img,1)
    print("人脸数:", len(dets))

    for k, d in enumerate(dets):

        if len(dets)>1:
            continue
        # 计算矩形大小
        # (x,y), (宽度width, 高度height)
        pos_start = tuple([d.left(), d.top()])
        pos_end = tuple([d.right(), d.bottom()])

        # 计算矩形框大小
        height = d.bottom()-d.top()
        width = d.right()-d.left()

        # 根据人脸大小生成空的图像
        img_blank = np.zeros((height, width, 3), np.uint8)

        for i in range(height):
            if d.top()+i>=img_height:# 防止越界
                continue
            for j in range(width):
                if d.left()+j>=img_width:# 防止越界
                    continue
                img_blank[i][j] = img[d.top()+i][d.left()+j]

        #cv2.imshow("face_"+str(k+1), img_blank)
        
        #几种不一样的插值方法
        # resize images to 200*200
        # temp=img_blank
        # img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_NEAREST)
        # cv2.imencode('.jpg', img_blank)[1].tofile(path_save + "/"+"INTER_NEAREST" + file_name)  # 正确方法
        #
        # temp = img_blank
        # img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_LINEAR)
        # cv2.imencode('.jpg', img_blank)[1].tofile(path_save + "/"  + "LINEAR"+file_name)  # 正确方法
        #
        # temp = img_blank
        # img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_AREA)
        # cv2.imencode('.jpg', img_blank)[1].tofile(path_save + "/" + "INTER_AREA"+ file_name)  # 正确方法
        #
        # temp = img_blank
        # img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_LANCZOS4)
        # cv2.imencode('.jpg', img_blank)[1].tofile(path_save + "/"  + "INTER_LANCZOS4"+ file_name)  # 正确方法


        img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_CUBIC)

        # cv2.imwrite(path_save+"/"+file_name, img_blank)

        # cv2.imwrite("我//h.jpg", frame) #该方法不成功 
        # cv2.imencode('.jpg', frame)[1].tofile('我/9.jpg') //正确方法 
        # 保存图片路径有非中文字符
        cv2.imencode('.jpg', img_blank)[1].tofile(path_save+"/"+file_name) # 正确方法
        #print(k)

        #cv2.waitKey(0)