Dlib实现人脸检测,并剪切人脸照

一、Dlib的安装:

如果你的Python版本也是3.6,那么安装dlib要简单很多,直接

pip install dlib==19.7.0

如果上面安装失败,就用博主附带的.whl文件进行安装吧。(如果你的Python版本不是3.6,又或者你想安装dlib其他的版本,博主就懒得写了,大家自己百度,但是你可以在这里找到合适的版本和方法。)
-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

二、用Dlib检测人脸,并做标记点

提示:31、34行的第一个数字参数是调节圆圈、数字大小的
重要:第10行,是需要下载这个文件的,我源代码里面有,下载我的源代码就行啦

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
# -*- 2019/01/13; 16:12
# -*- python3.6
import cv2
import dlib
import numpy as np


predictor_model = 'shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_model)

# cv2读取图像
test_film_path = "iuput_pic/0.jpg"
img = cv2.imread(test_film_path)
# 取灰度
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

# 人脸数rects
rects = detector(img_gray, 0)
for i in range(len(rects)):
    landmarks = np.matrix([[p.x, p.y] for p in predictor(img,rects[i]).parts()])
    #print(landmarks, type(landmarks))
    for idx, point in enumerate(landmarks):
        # 68点的坐标
        pos = (point[0, 0], point[0, 1])
        print(idx+1, pos)

        # 利用cv2.circle给每个特征点画一个圈,共68个
        cv2.circle(img, pos, 3, color=(0, 255, 0))
        # 利用cv2.putText输出1-68
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, str(idx+1), pos, font, 0.5, (0, 0, 255), 1, cv2.LINE_AA)

cv2.imwrite("result.png", img)
cv2.imshow("img", img)
cv2.waitKey(0)

效果展示图:
在这里插入图片描述

-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

三、用Dlib剪切出人脸照

有了上面的基础,想切出大头照的方法就很简单了,因为68个标记点坐标是存储在一个字典dict中,我们只需要比较68个坐标点的大小,确定其上、下、左、右四个最值就可以确定人脸的位置了。
比较坐标点,确定四个最值的函数如下:

def get_face_points(dict_A):
    """
    :param dict_A: 传入一个字典A,内容是包含一张人脸的所有标记点坐标
    :return: 返回人脸上、下、左、右的索引值
    """
    x_max = y_max = 0
    x_min = y_min = 2000

    for k_1, v_1 in dict_A.items():
        for k_2, v_2 in v_1.items():
            if k_2 == "x":
                if int(v_2) < x_min:
                    x_min = int(v_2)
                if int(v_2) > x_max:
                    x_max = int(v_2)
            else:
                if int(v_2) < y_min:
                    y_min = int(v_2)
                if int(v_2) > y_max:
                    y_max = int(v_2)
    return x_min, x_max, y_min, y_max

完整代码在这里下载,效果图如下:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zzZ_CMing/article/details/86428070
今日推荐