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

Aasee
发布于 2022-2-9 17:43
浏览
3收藏

春节不停更,此文正在参加「星光计划-春节更帖活动」

化妆

今天的项目就比较有意思了,给图片中的人脸进行化妆[坏笑],你们想想当你的女朋友说今天拍照忘记涂口红了忘记修眉毛了,这时你说你来,给他夸夸一顿操作结果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自行尝试更改,我这里继续使用彭于晏给大家展示哈哈

结果展示

实现人脸化妆 | 人脸识别系列-鸿蒙开发者社区
同时我也将其打包到我的github里了,如果大家想玩的话也可以直接去下载来玩。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
2
收藏 3
回复
举报
回复
    相关推荐