基于Python实现人脸自动戴口罩系统


Posted in Python onFebruary 06, 2020

1、项目背景

2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。

基于Python实现人脸自动戴口罩系统

抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示:

基于Python实现人脸自动戴口罩系统

本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官数据,根据这些数据,确定嘴唇部分的位置数据(48点~67点位置),根据检测到嘴部的尺寸和方向,借助PLL模块调整口罩的尺寸和方向,实现将口罩放在图像的适当位置。

基于Python实现人脸自动戴口罩系统

2、页面设计

 基于tkinter模块实现GUI设计,可载入人物图像,选择四种类型口罩(这里的口罩是处理好的图片),展示佩戴好口罩的效果,操作完成退出系统,效果如下所示:

基于Python实现人脸自动戴口罩系统

页面布局实现代码如下所示:

def __init__(self):
 self.root = tk.Tk()
 self.root.title('基于Pyhon的人脸自动戴口罩系统')
 self.root.geometry('1200x500')
 self.path1_ = None
 self.path2_ = None
 self.seg_img_path = None
 self.mask = None
 self.label_Img_seg = None
 decoration = PIL.Image.open('./pic/bg.png').resize((1200, 500))
 render = ImageTk.PhotoImage(decoration)
 img = tk.Label(image=render)
 img.image = render
 img.place(x=0, y=0)
 # 原图1的展示
 tk.Button(self.root, text="打开头像", command=self.show_original1_pic).place(x=50, y=120)
 tk.Button(self.root, text="退出软件", command=quit).place(x=900, y=40)
 tk.Label(self.root, text="头像", font=10).place(x=280, y=120)
 self.cv_orinial1 = tk.Canvas(self.root, bg='white', width=270, height=270)
 self.cv_orinial1.create_rectangle(8, 8, 260, 260, width=1, outline='red')
 self.cv_orinial1.place(x=180, y=150)
 self.label_Img_original1 = tk.Label(self.root)
 self.label_Img_original1.place(x=180, y=150)
 tk.Label(self.root,text="选择口罩",font=10).place(x=600,y=120)
 first_pic = Image.open("./pic/Mask.png")
 first_pic = first_pic.resize((60, 60), Image.ANTIALIAS)
 first_pic = ImageTk.PhotoImage(first_pic)
 self.first = tk.Label(self.root, image=first_pic)
 self.first.place(x=600,y=160, width=60, height=60)
 self.first.bind("<Button-1>", self.mask0)
 second_pic = Image.open("./pic/Mask1.png")
 second_pic = second_pic.resize((60, 60), Image.ANTIALIAS)
 second_pic = ImageTk.PhotoImage(second_pic)
 self.second_pic = tk.Label(self.root, image=second_pic)
 self.second_pic.place(x=600, y=230, width=60, height=60)
 self.second_pic.bind("<Button-1>", self.mask1)
 third_pic = Image.open("./pic/Mask3.png")
 third_pic = third_pic.resize((60, 60), Image.ANTIALIAS)
 third_pic = ImageTk.PhotoImage(third_pic)
 self.third_pic = tk.Label(self.root, image=third_pic)
 self.third_pic.place(x=600, y=300, width=60, height=60)
 self.third_pic.bind("<Button-1>", self.mask3)
 forth_pic = Image.open("./pic/Mask4.png")
 forth_pic = forth_pic.resize((60, 60), Image.ANTIALIAS)
 forth_pic = ImageTk.PhotoImage(forth_pic)
 self.forth_pic = tk.Label(self.root, image=forth_pic)
 self.forth_pic.place(x=600, y=370, width=60, height=60)
 self.forth_pic.bind("<Button-1>", self.mask4)
 tk.Label(self.root, text="佩戴效果", font=10).place(x=920, y=120)
 self.cv_seg = tk.Canvas(self.root, bg='white', width=270, height=270)
 self.cv_seg.create_rectangle(8, 8, 260, 260, width=1, outline='red')
 self.cv_seg.place(x=820, y=150)
 self.label_Img_seg = tk.Label(self.root)
 self.label_Img_seg.place(x=820, y=150)
 self.root.mainloop()

载入人物图像,实现代码如下所示:

# 原图1展示
 def show_original1_pic(self):
 self.path1_ = askopenfilename(title='选择文件')
 print(self.path1_)
 self.Img = PIL.Image.open(r'{}'.format(self.path1_))
 Img = self.Img.resize((270,270),PIL.Image.ANTIALIAS) # 调整图片大小至256x256
 img_png_original = ImageTk.PhotoImage(Img)
 self.label_Img_original1.config(image=img_png_original)
 self.label_Img_original1.image = img_png_original # keep a reference
 self.cv_orinial1.create_image(5, 5,anchor='nw', image=img_png_original)

人脸戴口罩展示,实现代码如下所示

# 人脸戴口罩效果展示
 def show_morpher_pic(self):
 img1 = cv2.imread(self.path1_)
 x_min, x_max, y_min, y_max, size = self.get_mouth(img1)
 adding = self.mask.resize(size)
 im = Image.fromarray(img1[:, :, ::-1]) # 切换RGB格式
 # 在合适位置添加头发图片
 im.paste(adding, (int(x_min), int(y_min)), adding)
 # im.show()
 save_path = self.path1_.split('.')[0]+'_result.jpg'
 im.save(save_path)
 Img = im.resize((270, 270), PIL.Image.ANTIALIAS) # 调整图片大小至270x270
 img_png_seg = ImageTk.PhotoImage(Img)
 self.label_Img_seg.config(image=img_png_seg)
 self.label_Img_seg.image = img_png_seg # keep a reference

导入四种口罩图像,实现代码如下所示:   

def mask0(self, event):
 self.mask = Image.open('pic/mask.png')
 self.show_morpher_pic()
 def mask1(self, event):
 self.mask = Image.open('pic/mask1.png')
 self.show_morpher_pic()
 def mask3(self, event):
 self.mask = Image.open('pic/mask3.png')
 self.show_morpher_pic()
 def mask4(self, event):
 self.mask = Image.open('pic/mask4.png')
 self.show_morpher_pic()

3、器官识别

页面功能实现后就是依托Dlib库实现人脸器官关键点的识别,分析出嘴部位置及尺寸,这里为了方便各位直观了解,写了一个测试Demo,将人物脸部关键点都显示出来,代码如下所示:

#coding=utf-8
#图片检测 - Dlib版本
import cv2
import dlib
import time
t=time.time()
path = "./pic/im.jpg"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
#人脸分类器
detector = dlib.get_frontal_face_detector()
# 获取人脸检测器
predictor = dlib.shape_predictor(
 "./shape_predictor_68_face_landmarks.dat"
)
dets = detector(gray, 1)
for face in dets:
 shape = predictor(img, face) # 寻找人脸的68个标定点
 # 遍历所有点,打印出其坐标,并圈出来
 for pt in shape.parts():
 pt_pos = (pt.x, pt.y)
 cv2.circle(img, pt_pos, 1, (0, 255, 0), 2)
 cv2.imshow("image", img)
print('所用时间为{}'.format(time.time()-t))
cv2.waitKey(0)
#cv2.destroyAllWindows()
time.sleep(5)

效果如下所示: 

基于Python实现人脸自动戴口罩系统

在本系统中这些关键点无需绘制显示,直接使用就可以,实现代码如下所示:

def get_mouth(self, img):
 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 detector = dlib.get_frontal_face_detector()
 predictor = dlib.shape_predictor('./shape_predictor_68_face_landmarks.dat')
 faces = detector(img_gray, 0)
 for k, d in enumerate(faces):
 x = []
 y = []
 # 人脸大小的高度
 height = d.bottom() - d.top()
 # 人脸大小的宽度
 width = d.right() - d.left()
 shape = predictor(img_gray, d)
 # 48-67 为嘴唇部分
 for i in range(48, 68):
 x.append(shape.part(i).x)
 y.append(shape.part(i).y)
 # 根据人脸的大小扩大嘴唇对应口罩的区域
 y_max = (int)(max(y) + height / 3)
 y_min = (int)(min(y) - height / 3)
 x_max = (int)(max(x) + width / 3)
 x_min = (int)(min(x) - width / 3)
 size = ((x_max - x_min), (y_max - y_min))
 return x_min, x_max, y_min, y_max, size

4、退出系统

退出系统非常简单,一行Demo即可实现,如下所示:

def quit(self):
 self.root.destroy()

总结

以上所述是小编给大家介绍的基于Python实现人脸自动戴口罩系统,希望对大家有所帮助!

Python 相关文章推荐
Python实现新浪博客备份的方法
Apr 27 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
python实现广度优先搜索过程解析
Oct 19 Python
pygame实现打字游戏
Feb 19 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
python实现扫雷游戏的示例
Oct 20 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
python OpenCV学习笔记
Mar 31 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 Python
python时间日期操作方法实例小结
Feb 06 #Python
python通过matplotlib生成复合饼图
Feb 06 #Python
tensorflow 初始化未初始化的变量实例
Feb 06 #Python
python中count函数简单的实例讲解
Feb 06 #Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 #Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 #Python
详解python 降级到3.6终极解决方案
Feb 06 #Python
You might like
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php正则表达式学习笔记
2015/11/13 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python多进程同步简单实现代码
2016/04/27 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
对python 命令的-u参数详解
2018/12/03 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
精彩的推荐信范文
2013/11/26 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers