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实现竖排打印传单手机号码易撕条
Mar 16 Python
Python3处理HTTP请求的实例
May 10 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python3 enum模块的应用实例详解
Aug 12 Python
Django之模板层的实现代码
Sep 09 Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 Python
Python如何重新加载模块
Jul 29 Python
Python在字符串中处理html和xml的方法
Jul 31 Python
Python -m参数原理及使用方法解析
Aug 21 Python
python 如何实现遗传算法
Sep 22 Python
Python之字典添加元素的几种方法
Sep 30 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 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 获取客户端的真实ip
2009/11/30 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
python win32 简单操作方法
2017/05/25 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
opencv python图像梯度实例详解
2020/02/04 Python
pytorch masked_fill报错的解决
2020/02/18 Python
Python用SSH连接到网络设备
2021/02/18 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
伊索寓言教学反思
2014/05/01 职场文书
司机岗位职责
2015/02/04 职场文书
八年级英语教学反思
2016/02/15 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server
Python超详细分步解析随机漫步
2022/03/17 Python
python语言中pandas字符串分割str.split()函数
2022/08/05 Python