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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
python实现周期方波信号频谱图
Jul 21 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
python属于解释语言吗
Jun 11 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
python图像处理 PIL Image操作实例
Apr 09 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分页示例代码
2007/03/19 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
在Windows8上的搭建Python和Django环境
2014/07/03 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
python更新列表的方法
2015/07/28 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
python使用thrift教程的方法示例
2019/03/21 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
python实现udp聊天窗口
2020/03/31 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
经典导游欢迎词
2015/01/26 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
高老头读书笔记
2015/06/30 职场文书
小学生教师节广播稿
2015/08/19 职场文书