0. 引言

  利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切;

 

  1. crop_faces_show.py :

    将检测到的人脸剪切下来,依次排序平铺显示在新的图像上;

    实现的效果如 图1 所示,将 图1 原图中的 6 张人脸检测出来,然后剪切下来,在图像窗口中依次输出显示人脸;

  2. crop_faces_save.py :

    将检测到的人脸存储为单个人脸图像;

  

图 1 原图 和 crop_faces_show.py 处理后得到的平铺人脸图像窗口

  

图 2 crop_faces_save.py 处理后得到的多个单张人脸图像文件

  源码上传到了我的 Github;

  如果对您有帮助或者感兴趣,欢迎 Star 支持下: GitHub - coneypo/Dlib_face_cut: Detect faces in the image and crop the faces / 使用 Dlib 进行人脸检测然后将人脸裁剪下来

1. 开发环境

  Python:  3.6.3

  Dlib:    19.7

  OpenCv, NumPy

import dlib                 # 人脸检测的库 Dlib
import numpy as np         # 数据处理的库 numpy
import cv2                  # 图像处理的库 OpenCv    

2. 实现过程

  工作内容主要以下两大块:Dlib 人脸检测  处理检测到的人脸图像

2.1 Dlib 人脸检测  

  利用已经训练好的 Dlib 正向人脸检测器 detector = dlib.get_frontal_face_detector() 进行人脸检测;

  可以得到人脸外接矩形的坐标,用来之后进行裁剪;

  具体 Dlib 的使用,请参考我另一篇博客;

  ( link: Python 3 利用 Dlib 19.7 进行人脸检测);

 1 # Dlib 检测器2  detector = dlib.get_frontal_face_detector()3   4  # 读取图像5  path = "/***/image_path/"6  img = cv2.imread(path+"test_faces.jpg")7  # print("img/shape:", img.shape)8   9  # Dlib 检测
10  faces = detector(img, 1)
11
12  print("人脸数:", len(faces))

2.2 绘制新图像

  如果你想让检测出来的人脸并排显示的话,需要遍历两次( for k, d in enumerate (faces) ):

   第一次遍历:记录下我们需要生成的图像窗口的大小,因为需要将多张照片显示在一张图像上,所以需要知道每张人脸照片的大小;

   第二次遍历:根据之前得到的图像尺寸新建空白图像,然后开始用人脸矩形填充图像;

2.2.1 确定空白图像尺寸

( 这部分首先要根据检测到的人脸数和人脸大小,来确定绘制图像所需要的尺寸)  

第一次遍历:多张人脸要输出到一行,所以先进行一次人脸的遍历j记下每张人脸的大小,记每张人脸的尺寸为 [ 高度 height  * 宽度 width ](高度和宽度说明见 图 3 ):

图 3 图像尺寸说明

我取的生成空白图像的尺寸:height_max(最大高度)和 width_sum(宽度之和),然后根据尺寸大小来新建空白图像:

img_blank = np.zeros((height_max, width_sum, 3), np.uint8)

图 4 图像尺寸 height_max 和 width_sum

2.2.2 图像填充

  第二次遍历:多根据之前得到的图像尺寸新建空白图像,然后开始用人脸矩形填充图像,每次 width 方向从 blank_start 位置开始,每次填完一张之后记得更新起始位置:( blank_start += width ):

for i in range(height):for j in range(width):img_blank[i][blank_start + j] = img[d.top() + i][d.left() + j]

    

  如果想访问图像的某点像素,可以利用 img [height] [width]:

    存储像素其实是一个三维数组,先高度 height,然后宽度 width;

    返回的是一个颜色数组( 0-255,0-255,0-255 ),按照( B, G, R )的顺序;

    比如 蓝色 就是(255,0,0),红色 是(0,0,255);

3. 源码

3.1 crop_faces_show.py

# created at 2018-01-22
# updated at 2018-09-29# Author:   coneypo
# Blog:     http://www.cnblogs.com/AdaminXie
# GitHub:   https://github.com/coneypo/Dlib_face_cutimport dlib         # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2          # 图像处理的库OpenCv# Dlib 检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 读取图像
path = "faces_for_test/"
img = cv2.imread(path+"test_faces_1.jpg")# Dlib 检测
dets = detector(img, 1)print("人脸数:", len(dets), "\n")# 记录人脸矩阵大小
height_max = 0
width_sum = 0# 计算要生成的图像 img_blank 大小
for k, d in enumerate(dets):# 计算矩形大小# (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()# 处理宽度width_sum += width# 处理高度if height > height_max:height_max = heightelse:height_max = height_max# 绘制用来显示人脸的图像的大小
print("窗口大小:", '\n', "高度 / height:", height_max, '\n', "宽度 / width: ", width_sum)# 生成用来显示的图像
img_blank = np.zeros((height_max, width_sum, 3), np.uint8)# 记录每次开始写入人脸像素的宽度位置
blank_start = 0# 将人脸填充到img_blank
for k, d in enumerate(dets):height = d.bottom()-d.top()width = d.right()-d.left()# 填充for i in range(height):for j in range(width):img_blank[i][blank_start+j] = img[d.top()+i][d.left()+j]# 调整图像blank_start += widthcv2.namedWindow("img_faces")#, 2)
cv2.imshow("img_faces", img_blank)
cv2.waitKey(0

实现效果:

图 5 原图和处理后得到的图像窗口

3.2 crop_faces_save.py

  如果你想将识别出来的人脸保存成单个的图像,方便之后处理用,只需将上述代码进行略微修改;

  只需一次遍历,根据每次检测到的人脸尺寸,新建空白图像后写入,然后利用 cv2.imwrite 写入到本地:

  crop_faces_save.py:

 1 # created at 2018-01-222 # updated at 2018-09-293 4 # Author:   coneypo5 # Blog:     http://www.cnblogs.com/AdaminXie6 # GitHub:   https://github.com/coneypo/Dlib_face_cut7 8 import dlib         # 人脸识别的库dlib9 import numpy as np  # 数据处理的库numpy
10 import cv2          # 图像处理的库OpenCv
11 import os
12
13 # 读取图像的路径
14 path_read = "faces_for_test/"
15 img = cv2.imread(path_read+"test_faces_3.jpg")
16
17 # 用来存储生成的单张人脸的路径
18 path_save = "faces_separated/"
19
20
21 # Delete old images
22 def clear_images():
23     imgs = os.listdir(path_save)
24
25     for img in imgs:
26         os.remove(path_save + img)
27
28     print("clean finish", '\n')
29
30
31 clear_images()
32
33
34 # Dlib 预测器
35 detector = dlib.get_frontal_face_detector()
36 predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
37
38
39 # Dlib 检测
40 faces = detector(img, 1)
41
42 print("人脸数:", len(faces), '\n')
43
44 for k, d in enumerate(faces):
45
46     # 计算矩形大小
47     # (x,y), (宽度width, 高度height)
48     pos_start = tuple([d.left(), d.top()])
49     pos_end = tuple([d.right(), d.bottom()])
50
51     # 计算矩形框大小
52     height = d.bottom()-d.top()
53     width = d.right()-d.left()
54
55     # 根据人脸大小生成空的图像
56     img_blank = np.zeros((height, width, 3), np.uint8)
57
58     for i in range(height):
59         for j in range(width):
60                 img_blank[i][j] = img[d.top()+i][d.left()+j]
61
62     # cv2.imshow("face_"+str(k+1), img_blank)
63
64     # 存在本地
65     print("Save to:", path_save+"img_face_"+str(k+1)+".jpg")
66     cv2.imwrite(path_save+"img_face_"+str(k+1)+".jpg", img_blank)

  

图 6 生成的单个人脸图像文件

# 请尊重他人劳动成果,转载或者使用源码请注明出处:http://www.cnblogs.com/AdaminXie

# 如果对您有帮助,欢迎在 GitHub 上 Star 本项目: GitHub - coneypo/Dlib_face_cut: Detect faces in the image and crop the faces / 使用 Dlib 进行人脸检测然后将人脸裁剪下来

Python 3 利用 Dlib 实现人脸检测和剪切相关推荐

  1. python dlib人脸检测_Python 3 利用 Dlib 实现人脸检测和剪切

    0. 引言 利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切: 将检测到的人脸剪切下来,依次排序平铺显示在新的图像上: 实现的效果如 图1 所示,将 ...

  2. 利用dlib进行人脸检测

    一.dlib环境搭建 1)dlib安装,pip install dlib.参考:http://www.cnblogs.com/vipstone/p/8964656.html . 2)训练模型下载:训练 ...

  3. Python 3 利用 Dlib 和 sklearn 人脸笑脸检测机器学习建模

    0. 引言 利用机器学习的方法训练微笑检测模型,输入一张人脸照片,判断是否微笑: 精度在 95% 左右( 使用的数据集中 69 张没笑脸,65 张有笑脸 ): 图1 测试图像与检测结果 项目实现的笑脸 ...

  4. python+opencv+dlib实现人脸检测与表情识别

    python+opencv+dlib实现人脸检测与表情识别 一,dlib简单介绍:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起 ...

  5. dlib实现人脸检测方法

    文章目录 `dlib`概述 人脸检测 CPU版本人脸检测算法 检测步骤 示例代码: CUDA版本人脸检测算法 检测步骤 示例代码 类定义与接口源码 人脸检测中用到的重要的类(概述) `fhog_obj ...

  6. C++ | 利用C++进行人脸检测,人脸识别,情绪识别

    环境:win10,VS2022, 1.利用C++实现OpenCV和haarcascade人脸检测 1.1.下载一张有人脸的照片 1.2.下载haarcascade_frontalface_defaul ...

  7. dlib做人脸检测判断有没有检测到人脸

    dlib做人脸检测判断有没有检测到人脸 文章目录: 一.人脸检测 二.判断有没有检测到人脸 其实我用dlib 检测人脸只是用来做个触发条件,但是我不知道怎么判断有没有检测到人,因为从返回值只知道是一个 ...

  8. 利用OpenCV实现人脸检测

    如何在一副图片中检测到人脸,这涉及到计算机图形学中一些非常复杂的计算,如果这些计算都靠程序员自己来编程,那么工作量就相当大.OpenCV全称是Open Computer Vision,是指开放的计算机 ...

  9. java dlib实现人脸检测_利用dlib库进行人脸检测

    一.dlib的使用 dlib需要预先的安装 ①安装Python还是推荐3.5 ②下载dlib的安装包 https://pypi.python.org/pypi/dlib/18.17.100 选择匹配的 ...

最新文章

  1. java小程序例子_「小程序JAVA实战」java的聚合项目搭建(30)
  2. hibernate02环境的搭建
  3. exhaustion java_Java Exceptions
  4. java 跨站点脚本编制_AppScan跨站点脚本编制修复
  5. linux下重装mysql_Linux下安装mysql
  6. Buffer.concat()
  7. 2017-2018-2 1723《程序设计与数据结构》第八周作业 实验二 第一周结对编程 总结...
  8. 洛谷——P1089 [NOIP2004 提高组] 津津的储蓄计划
  9. H3C Telnet 配置(利用Windows10 cmd)
  10. 64位plsql和64位Oracle客户端安装以及注册,内含百度云资源
  11. 花费巨资去培训SAP真的值得吗?
  12. wxPython下载安装教程
  13. 1988年图灵奖--伊万·萨瑟兰简介
  14. 个人博客网站编写(01)
  15. GoogleChrome与Firefox的那些事
  16. 学生个人网页设计作品 学生个人网页模板简单个人主页成品 个人网页制作 HTML学生个人网站作业设计
  17. win10任务栏自动隐藏失效
  18. 简单理解操作系统之存储器管理
  19. 在U盘上安装debian linux
  20. 计算机大一萌新,要补充哪些计算机基本知识

热门文章

  1. simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...
  2. 写一个函数,要求输入一个字符串和一个字符长度,根据字符长度对该字符串进行分隔
  3. iptables使用方法
  4. A标签中通过href和onclick传递的this对象实现思路
  5. 2017年全球光伏需求有望首次突破100吉瓦
  6. 用css绘制各种形状
  7. mysql 时区与时间函数
  8. 书评与访谈:the Scrumban [R]Evolution
  9. 传统KTV向互联网+量贩式低头,KTV也需O2O
  10. groupadd - 建 立 新 群 组