Python3结合Dlib实现人脸识别和剪切


Posted in Python onJanuary 24, 2018

0.引言

利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上;

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

实现比较简单,代码量也比较少,适合入门或者兴趣学习。

Python3结合Dlib实现人脸识别和剪切

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

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的使用,在我之前另一篇博客里面介绍过(link: https://3water.com/article/133576.htm);

2.2 绘制新图像:

2.2.1 确定空白图像尺寸

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

多张人脸要输出到一行,先进行一次人脸的遍历,记每张人脸的尺寸为height*width(高度和宽度说明见图2),

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

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

2.2.2 图像填充

然后再进行一次人脸遍历,这次进行空白图像img_blank进行填充:

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

Python3结合Dlib实现人脸识别和剪切

图2 图像尺寸说明

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

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

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

3.源码

# 2018-01-22
# By TimeStamp
# #cnblogs: http://www.cnblogs.com/AdaminXie/
import 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 = "F:/code/python/***/pic/"
img = cv2.imread(path+"test.jpg")
#print("img/shape:", img.shape)
# dlib检测
dets = detector(img, 1)
print("人脸数:", len(dets))
# 记录人脸矩阵大小
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 = height
else:
height_max = height_max
# 绘制用来显示人脸的图像的大小
print("img_blank的大小:")
print("高度", height_max, "宽度", 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 += width
cv2.namedWindow("img_faces", 2)
cv2.imshow("img_faces", img_blank)
cv2.waitKey(0)

结果:

 Python3结合Dlib实现人脸识别和剪切

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

以上就是本次我们介绍的关于Python3结合Dlib实现人脸识别和剪切的相关技术内容,大家如果在学习后还有任何不明白的地方可以在下方的留言区讨论。

Python 相关文章推荐
python paramiko实现ssh远程访问的方法
Dec 03 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
对Python3中的input函数详解
Apr 22 Python
python将秒数转化为时间格式的实例
Sep 16 Python
python ddt数据驱动最简实例代码
Feb 22 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
Django发送邮件功能实例详解
Sep 02 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
在keras里实现自定义上采样层
Jun 28 Python
Python3压缩和解压缩实现代码
Mar 01 Python
python之基数排序的实现
Jul 26 Python
深入浅析Python中的yield关键字
Jan 24 #Python
Python3.6安装及引入Requests库的实现方法
Jan 24 #Python
pycharm+django创建一个搜索网页实例代码
Jan 24 #Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 #Python
Sublime开发python程序的示例代码
Jan 24 #Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 #Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 #Python
You might like
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
php短信接口代码
2016/05/13 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用chardet判断字符编码
2015/05/09 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
华为python面试题
2016/05/03 面试题
意外伤害赔偿协议书范本
2014/09/28 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python