Python-dlib实现人脸提取和分割

效果

Python-dlib实现人脸提取和分割_第1张图片Python-dlib实现人脸提取和分割_第2张图片

参考资料和资源

GitHub - Onwaier/SegfaceAndAlignByDlib: 用dlib实现脸部分割和人脸对齐

shape_predictor_68_face_landmarks.dat 下载地址_shape_predictor_68_face_landmarks.dat下载-CSDN博客

未运行的参考资料 dlib实现脸部分割与人脸对齐 - 知乎

单图片读取并另存人脸图

"""
代码功能:
1. 用dlib人脸检测器检测出人脸,返回的人脸矩形框
2. 对检测出的人脸进行关键点检测并切割出人脸
"""
import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt

# In[]
imgname='1'
in_path = imgname+".jpg"
outpts = 100
out_path = imgname+'-face.jpg'
colorRGB=cv2.COLOR_BGR2RGB

# In[]
# cv2读取图像
img = cv2.imread(in_path)#,cv2.IMREAD_COLOR)BGR阵列是蓝脸,需要转换成正常色
img = cv2.cvtColor(img, colorRGB)
plt.imshow(img);

# In[]
predictor_model = 'shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()# dlib人脸检测器
predictor = dlib.shape_predictor(predictor_model)
# In[]
# 人脸数rects
rects = detector(img, 0)
# faces存储full_object_detection对象
faces = dlib.full_object_detections()

for i in range(len(rects)):
    faces.append(predictor(img,rects[i]))

face_images = dlib.get_face_chips(img, faces, size=outpts)
for image in face_images:
    cv_bgr_img = cv2.cvtColor(image, colorRGB)
    cv2.imwrite(out_path, cv_bgr_img)

多个子文件夹另存人脸图:len(faces)

import os
import shutil
import warnings
import cv2
import io
import matplotlib.pyplot as plt
import dlib

from PIL import Image
warnings.filterwarnings("error", category=UserWarning)
PATH1 = "data300"
outpts = 120

sum = 0
colorRGB=cv2.COLOR_BGR2RGB

def is_read_successfully(file):
    try:
        imgFile = Image.open(file)
        return True
    except Exception:
        return False

def clipface(parent,file):
    in_path=os.path.join(parent, file)
    img = cv2.imread(in_path)#cv2.IMREAD_COLOR)BGR阵列是蓝脸,需要转换成正常色
    img = cv2.cvtColor(img, colorRGB)
    # plt.imshow(img);
    detector = dlib.get_frontal_face_detector()# dlib人脸检测器
    predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
    # 人脸数rects
    rects = detector(img, 0)
    # faces存储full_object_detection对象
    faces = dlib.full_object_detections()
    for i in range(len(rects)):
        faces.append(predictor(img,rects[i]))

    if len(faces)>0:
        # http://dlib.net/python/index.html#dlib_pybind11.get_face_chips
        face_images = dlib.get_face_chips(img, faces, size = outpts)
        for image in face_images:
            cv_bgr_img = cv2.cvtColor(image, colorRGB)
            if not os.path.exists('face'):
                os.makedirs('face')
            out_dir=os.path.join('face', parent)
            out_file=os.path.join('face', parent, file)
            if not os.path.exists(out_dir):
                os.makedirs(out_dir)
                print('newfolder '+ out_dir)
            cv2.imwrite(out_file, cv_bgr_img)
            print('doneclip '+ out_file)

if __name__=="__main__":
    #子文件夹
    for childlist in os.listdir(PATH1):
        #子文件夹路径
        childPATH = PATH1 + '/'+ str(childlist)
        for cpath, dirs, files in os.walk(childPATH):
            # print(cpath)
            if childlist=='0':
                print (childlist)
                for file in files:
                    in_file=os.path.join(cpath, file)
                    if not is_read_successfully(in_file):
                        print('cant open '+ in_file)
                    else:
                        sum+=1
                        print(str(sum)+ 'read ' +  in_file)
                        clipface(cpath,file)

你可能感兴趣的:(python,开发语言)