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 抓取动态网页内容方案详解
Dec 25 Python
老生常谈Python进阶之装饰器
May 11 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python实现翻转数组功能示例
Jan 12 Python
numpy matrix和array的乘和加实例
Jun 28 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
python3 深浅copy对比详解
Aug 12 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
python 装饰器功能与用法案例详解
Mar 06 Python
Python colormap库的安装和使用详情
Oct 06 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 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 zip文件解压类代码
2009/12/02 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
基于jquery的多功能软键盘插件
2012/07/25 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
全面了解python字符串和字典
2016/07/07 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
matplotlib中legend位置调整解析
2017/12/19 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python Flask框架扩展操作示例
2019/05/03 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
以下的初始化有什么区别
2013/12/16 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
自我评价的正确写法
2013/09/19 职场文书
七年级历史教学反思
2014/02/05 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
分公司任命书
2014/06/06 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android