疫情期间,每个人都必须戴口罩。 看我用 Python 给你戴上面具。 不要大意。

导语

当前全球疫情形势严峻复杂

疫情传播风险进一步增大

                                              提醒大家

                                        即使在接种疫苗后

                                        也要坚持戴口罩

                                          加强个人防护

图片

​2019年底开始蔓延的新肺炎疫情影响着人们的心脏。

作为一个个体,我们能做的就是尽量少呆在家里。

就算要出门每个人都开始戴口罩,所以涉及不同的口罩类型大小。

所以我花了一些时间编写了一个小程序,叫做可调节面罩。它可以很容易地为图片中的肖像戴上面罩,而且面罩的方向和大小更适合面部~

正文

安装环境

(1)python3版本即可,模块直接安装;

pip install face-mask

(2)直接指定要放在图像中的人像遮罩上的图像路径,将生成新图像(附加-with-mask后缀):

face-mask /path/to/face/picture

(3)指定–show选项,还可以使用默认图片查看器打开新生成的图片:

face-mask /path/to/face/picture --show

效果:

给神仙小姐姐戴上面具。

​​

给多人带上面具。

​​给动漫人物戴上面具。

思考

要想实现上面的影响,我们应该怎么做?不妨这么想:

  • 第一步是识别鼻子(桥)和面部轮廓(下巴)
  • 面的左点、底点和右点由面轮廓确定
  • 从鼻子和脸的底部确定面具尺寸的高度和中心线
  • 把面具平分为两部分
  • 调整左遮罩的大小。宽度是从面的左侧点到中心线的距离
  • 调整右遮罩的大小。宽度是从面的右点到中心线的距离
  • 将左右遮罩合并为新遮罩
  • 以中心线相对于Y轴的旋转角度旋转新遮罩
  • 把新面具放在原图上

关于人脸识别,可以使用face_recognition库进行识别。

关于图像处理,可以使用Pillow库进行处理。

人脸识别

​​

在帮助下face_recognition图书馆可以很容易地辨认出肖像,最后face_landmarks这是一份名单,每个人face_landmark这意味着一个人就像数据。

face_landmark是一个字典,其中键表示纵向特征,值表示该特征的点列表。例如:

  • 钥匙nose_bridge鼻梁
  • 钥匙chin面颊

我们需要face_landmark,戴上相应头像的面具。

得到鼻子和脸颊的特征点。

​​

通过上面的代码,我们得到:

  • 代表鼻梁上部的点nose_point
  • 表示面的左点chin_left_point
  • 右面点chin_right_point
  • 表示面的底部chin_bottom_point

拆分、缩放和合并遮罩

​​

以上代码主要如下:

  • 把面具平分为两部分
  • 调整左遮罩的大小。宽度是从面的左侧点到中心线的距离 * 宽度系数 1.2
  • 调整右遮罩的大小。宽度是从面的右点到中心线的距离 * 宽度系数 1.2
  • 将左右遮罩合并为新遮罩

get_distance_from_point_to_line它用来计算点到线的距离。具体的实现可以在源代码中看到。

width_ratio宽度因子,用于正确展开遮罩。原因是我们根据脸颊的宽度来计算口罩的宽度,但是口罩在耳朵上,实际宽度应该更宽。

旋转面罩并将其放置到位

​​

以上代码主要如下:

  • 以中心线相对于Y轴的旋转角度旋转新遮罩
  • 计算应该放置遮罩的坐标
  • 把新的遮罩放在计算出的原始图片坐标下

最后,新图像将保存到本地路径,并且代码将不会显示。

总结

我们在帮助下face_recognition 库可以轻松的识别出人像,然后根据脸颊的宽度和鼻梁位置计算出口罩的大小、方向和位置,并最终生成出戴上口罩的图片。

整个过程并不复杂,但在坐标计算上要格外小心,如此,我们便打造了一个短小精悍的自动戴上口罩程序!很多小伙伴在学习Python的过程中往往因为没有资料或者没人指导从而导致自己不想学下去了….

因此我特意准备了大量的PDF书籍、视频教程,都免费送给大家!不管你是零基础还是有基础都可以获取到自己相对应的学习礼包!包括Python软件工具和2021最新入门到实战教程!

🎊🎊源码基地:关注小编获取更多精彩内容哦~💝记得三连吖

物联沃分享整理
物联沃-IOTWORD物联网 » 疫情期间,每个人都必须戴口罩。 看我用 Python 给你戴上面具。 不要大意。

发表评论