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 支持下: https://github.com/coneypo/Dlib_face_cut

1. 开发环境

  Python:  3.6.3

  Dlib:    19.7

  OpenCv, NumPy

  1. import dlib # 人脸检测的库 Dlib
  2. import numpy as np    # 数据处理的库 numpy
  3. 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(宽度之和),然后根据尺寸大小来新建空白图像:

  1. 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 ):

  1. for i in range(height):
  2. for j in range(width):
  3. 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

  1. # created at 2018-01-22
  2. # updated at 2018-09-29
  3.  
  4. # Author: coneypo
  5. # Blog: http://www.cnblogs.com/AdaminXie
  6. # GitHub: https://github.com/coneypo/Dlib_face_cut
  7.  
  8. import dlib # 人脸识别的库dlib
  9. import numpy as np # 数据处理的库numpy
  10. import cv2 # 图像处理的库OpenCv
  11.  
  12. # Dlib 检测器
  13. detector = dlib.get_frontal_face_detector()
  14. predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
  15.  
  16. # 读取图像
  17. path = "faces_for_test/"
  18. img = cv2.imread(path+"test_faces_1.jpg")
  19.  
  20. # Dlib 检测
  21. dets = detector(img, 1)
  22.  
  23. print("人脸数:", len(dets), "\n")
  24.  
  25. # 记录人脸矩阵大小
  26. height_max = 0
  27. width_sum = 0
  28.  
  29. # 计算要生成的图像 img_blank 大小
  30. for k, d in enumerate(dets):
  31.  
  32. # 计算矩形大小
  33. # (x,y), (宽度width, 高度height)
  34. pos_start = tuple([d.left(), d.top()])
  35. pos_end = tuple([d.right(), d.bottom()])
  36.  
  37. # 计算矩形框大小
  38. height = d.bottom()-d.top()
  39. width = d.right()-d.left()
  40.  
  41. # 处理宽度
  42. width_sum += width
  43.  
  44. # 处理高度
  45. if height > height_max:
  46. height_max = height
  47. else:
  48. height_max = height_max
  49.  
  50. # 绘制用来显示人脸的图像的大小
  51. print("窗口大小:"
  52. , '\n', "高度 / height:", height_max
  53. , '\n', "宽度 / width: ", width_sum)
  54.  
  55. # 生成用来显示的图像
  56. img_blank = np.zeros((height_max, width_sum, 3), np.uint8)
  57.  
  58. # 记录每次开始写入人脸像素的宽度位置
  59. blank_start = 0
  60.  
  61. # 将人脸填充到img_blank
  62. for k, d in enumerate(dets):
  63.  
  64. height = d.bottom()-d.top()
  65. width = d.right()-d.left()
  66.  
  67. # 填充
  68. for i in range(height):
  69. for j in range(width):
  70. img_blank[i][blank_start+j] = img[d.top()+i][d.left()+j]
  71. # 调整图像
  72. blank_start += width
  73.  
  74. cv2.namedWindow("img_faces")#, 2)
  75. cv2.imshow("img_faces", img_blank)
  76. cv2.waitKey(0

实现效果:

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

3.2 crop_faces_save.py

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

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

  crop_faces_save.py:

  1. # created at 2018-01-22
  2. # updated at 2018-09-29
  3.  
  4. # Author: coneypo
  5. # Blog: http://www.cnblogs.com/AdaminXie
  6. # GitHub: https://github.com/coneypo/Dlib_face_cut
  7.  
  8. import dlib # 人脸识别的库dlib
  9. 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. # Delete old images
  21. def clear_images():
  22. imgs = os.listdir(path_save)
  23.  
  24. for img in imgs:
  25. os.remove(path_save + img)
  26.  
  27. print("clean finish", '\n')
  28.  
  29. clear_images()
  30.  
  31. # Dlib 预测器
  32. detector = dlib.get_frontal_face_detector()
  33. predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
  34.  
  35. # Dlib 检测
  36. faces = detector(img, 1)
  37.  
  38. print("人脸数:", len(faces), '\n')
  39.  
  40. for k, d in enumerate(faces):
  41.  
  42. # 计算矩形大小
  43. # (x,y), (宽度width, 高度height)
  44. pos_start = tuple([d.left(), d.top()])
  45. pos_end = tuple([d.right(), d.bottom()])
  46.  
  47. # 计算矩形框大小
  48. height = d.bottom()-d.top()
  49. width = d.right()-d.left()
  50.  
  51. # 根据人脸大小生成空的图像
  52. img_blank = np.zeros((height, width, 3), np.uint8)
  53.  
  54. for i in range(height):
  55. for j in range(width):
  56. img_blank[i][j] = img[d.top()+i][d.left()+j]
  57.  
  58. # cv2.imshow("face_"+str(k+1), img_blank)
  59.  
  60. # 存在本地
  61. print("Save to:", path_save+"img_face_"+str(k+1)+".jpg")
  62. cv2.imwrite(path_save+"img_face_"+str(k+1)+".jpg", img_blank)

  

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

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

# 如果对您有帮助,欢迎在 GitHub 上 Star 本项目: https://github.com/coneypo/Dlib_face_cut

# 如有问题请留言或者联系邮箱 coneypo@foxmail.com

Python 3 利用 Dlib 19.7 实现人脸识别和剪切的更多相关文章

  1. Python 3 利用 Dlib 19.7 进行人脸检测

    0. 引言 / Overview 介绍 Dlib 中基于 HOG,Histogram of Oriented Gradients / 方向梯度直方图 实现 Face Detect / 人脸检测 的两个 ...

  2. Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  3. Python 3 利用 Dlib 19.7 实现摄像头人脸识别

    0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地: 根据抠取的 ...

  4. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  5. Python 3 利用 Dlib 实现摄像头人脸检测特征点标定

    0. 引言 利用 Python 开发,借助 Dlib 库捕获摄像头中的人脸,进行实时人脸 68 个特征点标定: 支持多张人脸: 有截图功能: 图 1 工程效果示例( gif ) 图 2 工程效果示例( ...

  6. Python 3 利用 Dlib 实现人脸检测和剪切

    0. 引言 利用 Python 开发,借助 Dlib 库进行人脸检测 / face detection 和剪切:   1. crop_faces_show.py : 将检测到的人脸剪切下来,依次排序平 ...

  7. Python 3.6.3 利用 Dlib 19.7 和 opencv 实现人脸68点定位 进行人脸识别

    0.引言 介绍利用Dlib官方给的人脸识别预测器"shape_predictor_68_face_landmarks.dat"进行68点标定,利用OpenCv进行图像化处理,在人脸 ...

  8. Python 3.6.3 利用Dlib 19.7库进行人脸识别

    0.引言 自己在下载dlib官网给的example代码时,一开始不知道怎么使用,在一番摸索之后弄明白怎么使用了: 现分享下 face_detector.py 和 face_landmark_detec ...

  9. Python 3 利用 Dlib 实现人脸 68个 特征点的标定

    0. 引言 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进行 68 个点标定: 利用 OpenCv 进行图像化处理,在人脸上画出 ...

随机推荐

  1. [C#]使用Redis来存储键值对(Key-Value Pair)

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.5及以 ...

  2. CSS3 使用选择器在页面插入内容

    使用选择器来插入文字 h2:before{ content:'COLUMN'; color:white: background-color:orange: padding:1px 5px; } 注意点 ...

  3. 扩展1 - Python 获取当前时间的用法

    1.先导入库:import datetime 2.获取当前日期和时间:now_time = datetime.datetime.now() 3.格式化成我们想要的日期:strftime() 比如:“2 ...

  4. 《Create Your own PHP Framework》笔记

    前言 大力推荐该教程:<Create Your own PHP Framework> Symfony的学习蛮累的,官方文档虽然很丰富,但是组织方式像参考书而不是指南,一些不错的指导性文档常 ...

  5. Appsacn 定期自动化扫描

    appscan提供了计划扫描的选项,配合windows的计划任务,可以按需设定. 操作流程如下: 1.打开Appsacn--工具---扫描调度程序---新建 2.新建后显示如下窗口 3.填写好相应的设 ...

  6. JAVA模板方法

    package project01; abstract class MyRuntime{ public final void runtime(){ long starttime =System.cur ...

  7. NPOI 2.0 教程

    NPOI2.0帮助官方地址 目录 1. 前言 1.1 NPOI 2.0与NPOI 1.x的区别 1.2 NPOI 2.0模块简介 1.3 自动识别并打开Excel 2003和Excel 2007文件 ...

  8. vue2.0表单事件的绑定

    v-model 1.input type="text" <template> <div id="app"> <label for= ...

  9. swift4.0 正则表达式判断手机号

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Menlo; color: #ffffff; background-color: #282b3 ...

  10. 安卓电量优化之WakeLock锁机制全面解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.WakeLock概述 wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态.比如,手机屏幕在屏幕关闭 ...