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 13 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
Django框架中方法的访问和查找
Jul 15 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
python实现二分查找算法
Sep 18 Python
Python实现滑雪小游戏
Sep 25 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
德劲1103的维修打理经验
2021/03/02 无线电
PHPMailer 中文使用说明小结
2010/01/22 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
python 正则表达式 概述及常用字符
2009/05/04 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
班级课外活动总结
2014/07/09 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
小学中等生评语
2014/12/29 职场文书
初二物理教学反思
2016/02/19 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
MySQL连接控制插件介绍
2021/09/25 MySQL