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程序中设置HTTP代理
Nov 06 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
python实现拓扑排序的基本教程
Mar 11 Python
实例讲解python中的协程
Oct 08 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 Python
Python基于Tkinter编写crc校验工具
May 06 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
python线性插值解析
Jul 05 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中Session的概念
2006/10/09 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python日志logging模块使用方法分析
2019/05/23 Python
python requests使用socks5的例子
2019/07/25 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
windows支持哪个版本的python
2020/07/03 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
.NET面试10题
2014/02/24 面试题
档案管理员岗位职责
2013/12/01 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
交通事故和解协议书
2015/01/27 职场文书
文案策划岗位职责
2015/02/11 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android