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在指定目录下查找gif文件的方法
May 04 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
教你学会使用Python正则表达式
Sep 07 Python
python最长回文串算法
Jun 04 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
Python实战之用tkinter库做一个鼠标模拟点击器
Apr 27 Python
Python实现视频中添加音频工具详解
Dec 06 Python
python双向链表实例详解
May 25 Python
python如何为list实现find方法
May 30 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下使用SimpleXML 处理XML 文件
2010/02/27 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
解析Python中的__getitem__专有方法
2016/06/27 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
解决Python使用列表副本的问题
2019/12/19 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
介绍一下write命令
2014/08/10 面试题
研究生毕业鉴定
2014/01/29 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
公司授权委托书范文
2014/09/21 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python