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中的命令行参数解析工具之docopt详解
Mar 27 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
python主线程捕获子线程的方法
Jun 17 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
django 通过URL访问上传的文件方法
Jul 28 Python
简单的Python调度器Schedule详解
Aug 30 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
Python numpy多维数组实现原理详解
Mar 10 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP四大安全策略
2014/03/12 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
python多线程分块读取文件
2019/08/29 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
降低python版本的操作方法
2020/09/11 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
家装业务员岗位职责
2015/04/03 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
教师节祝酒词
2015/08/11 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
vscode中使用npm安装babel的方法
2021/08/02 Javascript
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers
linux目录管理方法介绍
2022/06/01 Servers