自动为你的照片带上一副眼镜

咪哥杂谈

本篇阅读时间约为 6 分钟。

1

前言

上篇文章讲解了如何将我们的"附属品"(例如眼镜、圣诞帽、口罩)图片背景透明化,那今天来介绍下实现自动带上眼镜的方法,通过人脸识别,识别出大概的位置,然后将图片覆盖上去。

最终实现效果:

自动为你的照片带上一副眼镜_第1张图片

2

环境准备

安装好之前两篇文章内容提到的第三方库。

回顾链接:

如何用技术手段将图片背景变为透明?

用Python鬼畜特朗普照片,了解下?

3

原理思路讲解

1. 裁剪眼镜图片,以左上角为基点

随便网上找一张眼镜图片,原本大小为下图所示:

自动为你的照片带上一副眼镜_第2张图片

使用程序来实现图片叠加,是以图片左上角为基准,显然,如果现在这个图片附到周董开车的脸上,眼镜的这张图片即使透明化也不能完美的贴上去。

所以需要尽可能的将眼镜图片裁剪成如下的样子(白色背景是图片实际大小):

自动为你的照片带上一副眼镜_第3张图片

2. 人脸识别库,识别出人脸的左侧脸颊和左眼眉的空间点

自动为你的照片带上一副眼镜_第4张图片

人脸识别库可以帮我们识别出特征值的坐标,如果想得到画红线的部分大概坐标,只需要你获取左侧脸颊的x坐标以及左侧眼眉的y坐标,即可得到差不多的位置。

自动为你的照片带上一副眼镜_第5张图片

(左脸颊x坐标,左眼眉y坐标),这组坐标即是我们要将眼镜图片以左上角为基准,贴过来的图片。

对比看下,眼镜腿是不是差不多在红框的位置:

自动为你的照片带上一副眼镜_第6张图片

3. 重塑眼镜图片尺寸大小

图片都是由像素点组成,每张照片的长宽都不一样,而眼镜图片的大小也一样,单纯的裁剪工具并不能完美的使眼镜附和到周董图片上。所以这里就有了一步重新塑造图片大小的步骤。

"附属品"的图片大小,需要根据原图片的像素算出一个缩小比例的因子,根据因子对"附属品"图片进行对应的比例进行缩小。

而这个因子如何计算?(需要点基础数学知识)

需要得知眼镜原图片的长像素,比如我的现在眼镜原图像素为:

自动为你的照片带上一副眼镜_第7张图片

而周董原图中,脸颊的左端点到右端点可以计算出来:

自动为你的照片带上一副眼镜_第8张图片

所以等比缩放因子,即 脸颊像素长度/眼镜图片长度像素。

案例中,缩放因子 = 446/1586 ≈ 0.28

4. 组合图片

以上所有步骤准备好后,直接将眼镜图片组合到周董图片上即可。

4

置换图片,呈现结果

下图是胡歌在录制《朗读者》时候的一个截图:

自动为你的照片带上一副眼镜_第9张图片

自动戴眼镜,成像之后:

自动为你的照片带上一副眼镜_第10张图片

5

总结

思路给大家梳理了一遍,其实熟悉我写作风格的小伙伴应该明白,编程思路有了,实现并不是难题。

其中需要动脑子的地方,就是关于”附属品“图片的等比例缩小,有个简单的小算法,还有一个地方就是"附属品"图片的左上方坐标,对标到人脸的左脸颊上方。

对于代码的细节,我没有在文章中写出来,写出来估计会很枯燥,如果你对源代码感兴趣,老规矩,我上传到 github 了。

后台回复 "眼镜" ,即可获得源码地址。

题图 - pexels - Philipp Birmes


往期精彩回顾

如何用技术手段将图片背景变为透明?

用Python鬼畜特朗普照片,了解下?

你可能感兴趣的:(自动为你的照片带上一副眼镜)