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处理圆角图片、圆形图片的例子
Apr 25 Python
进一步理解Python中的函数编程
Apr 13 Python
Python的语言类型(详解)
Jun 24 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
实践Vim配置python开发环境
Jul 02 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
python 初始化一个定长的数组实例
Dec 02 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
Python 用户输入和while循环的操作
May 23 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 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 $_ENV为空的原因分析
2009/06/01 PHP
PHP封装的Twitter访问类实例
2015/07/18 PHP
php生成与读取excel文件
2016/10/14 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
node.js基础知识小结
2018/02/26 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
Python collections模块实例讲解
2014/04/07 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python实现二维数组输出为图片
2018/04/03 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python变量访问权限控制详解
2019/06/29 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Python 必须了解的5种高级特征
2020/09/10 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
2014年五一促销活动方案
2014/03/09 职场文书
贷款委托书范本
2014/04/08 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
自主招生教师推荐信
2014/05/10 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
2014年司法局工作总结
2014/12/11 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript