化妆
今天的项目就比较有意思了,给图片中的人脸进行化妆[坏笑],你们想想当你的女朋友说今天拍照忘记涂口红了忘记修眉毛了,这时你说你来,给他夸夸一顿操作结果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里了,如果大家想玩的话也可以直接去下载来玩。