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 相关文章推荐
pandas 读取各种格式文件的方法
Jun 22 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
Apr 10 Python
tensorflow常用函数API介绍
Apr 19 Python
基于python连接oracle导并出数据文件
Apr 28 Python
django模板获取list中指定索引的值方式
May 14 Python
Python开发入门——迭代的基本使用
Sep 03 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实现递归与无限分类的方法
2015/02/16 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
php中smarty区域循环的方法
2015/06/11 PHP
用javascript添加控件自定义属性解析
2013/11/25 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
使用python3实现操作串口详解
2019/01/01 Python
Python如何在DataFrame增加数值
2020/02/14 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
pandas分组聚合详解
2020/04/10 Python
Python如何获取文件路径/目录
2020/09/22 Python
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
企业后勤岗位职责
2014/02/28 职场文书
海飞丝广告词
2014/03/20 职场文书
学期评语大全
2014/04/30 职场文书
团支部建设方案
2014/05/02 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
追讨欠款律师函
2015/06/24 职场文书
记者节感言
2015/08/03 职场文书
Python socket如何解析HTTP请求内容
2022/02/12 Python