人脸识别系列 | 实现人脸化妆

Aasee 发表于 2022/02/14 15:29:08 2022/02/14
【摘要】 化妆今天的项目就比较有意思了,给图片中的人脸进行化妆[坏笑],你们想想当你的女朋友说今天拍照忘记涂口红了忘记修眉毛了,这时你说你来,给他夸夸一顿操作结果P的更丑了,这不厕所里打灯笼–找屎吗,不过不要慌今天就由我来拯救你们,咳咳进入正题。首先,我们还是得先知道一下需要用到的函数都有哪些,主要就是运用了这两个face_landmarks(上一篇已经讲过了,但是为了大家更好的体验和更快的了解我还...

化妆

今天的项目就比较有意思了,给图片中的人脸进行化妆[坏笑],你们想想当你的女朋友说今天拍照忘记涂口红了忘记修眉毛了,这时你说你来,给他夸夸一顿操作结果P的更丑了,这不厕所里打灯笼–找屎吗,不过不要慌今天就由我来拯救你们,咳咳进入正题。
首先,我们还是得先知道一下需要用到的函数都有哪些,主要就是运用了这两个face_landmarks(上一篇已经讲过了,但是为了大家更好的体验和更快的了解我还是给大家弄过来吧),ImageDraw.polygon。

人脸特征提取函数——face_landmarks

face_landmarks( face_image , face_locations=None, model=“large” ) 给定一个图像,提取图像中每个人脸的脸部特征位置 参数: face_image :输入的人脸图片 face_locations=None : 可选参数,默认值为None,代表默认解码图片中的每一个人脸。 若输入face_locations()[i]可指定人脸进行解码 model=“large” :输出的特征模型,默认为“large”,可选“small”。 当选择为"small"时,只提取左眼left_eye、右眼right_eye、鼻尖nose_tip这三种脸部特征。

ImageDraw.polygon

构建一个ImageDraw对象: polygon() 方法用于绘制多边形:第一个参数是多边形的几 个顶点位置组成的list,第二个参数fill是填充该多边形的颜 色。 line() 方法是用来画多个点之间构成的线段,第一个参数是 点位置组成的list,第二个参数fill是线段的颜色,第三个参 数width是线段的宽度。
通过使用face_landmarks来定位到人脸的特征面貌之后,给其使用Image.polygon绘制多边形,接下来详细的代码解释啦

具体代码

import face_recognition
from PIL import Image, ImageDraw
def demoFunc2(pic_path):
    
     # 将图片加载为numpy数组
    image = face_recognition.load_image_file(pic_path)
    face_landmarks_list = face_recognition.face_landmarks(image)
    print(f"I found {len(face_landmarks_list)} face<s> in this photograph."))
    pil_image = Image.fromarray(image)
	# 遍历人脸, 绘制
    for face_landmarks in face_landmarks_list: 
        demo = ImageDraw.Draw(pil_image, 'RGBA')
        demo.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))
        demo.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))
        # demo.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=2)
        # demo.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=2)
        demo.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))
        # demo.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
        demo.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
        # demo.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=2)
        # demo.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=2)
        demo.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))
        demo.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))

        # pil_image.save("1_.jpg")   #可以使用save方法进行保存
        pil_image.show()
demoFunc2("6.png")

我发现使用line方法进行描边后有点奇怪,所以我在这里进行了删减,你们也可以自行尝试,颜色也可以按照RGBA自行尝试更改,我这里继续使用彭于晏给大家展示哈哈

结果展示

pyy
同时我也将其打包到我的github里了,如果大家想玩的话也可以直接去下载来玩。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。