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

咪哥杂谈

共 1133字,需浏览 3分钟

 ·

2020-04-07 23:22

咪哥杂谈


41943ddb5e48520b1b502ca8ac5d5ac5.webp

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


1

前言


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



2

环境准备


安装好之前两篇文章内容提到的第三方库。
回顾链接:
如何用技术手段将图片背景变为透明?
用Python鬼畜特朗普照片,了解下?


3

原理思路讲解


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


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


be609065ff7eaf96c4251068cd7a3f47.webp

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


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

321d6e82efd3d22df9d9032708248ce2.webp

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


257007db52e15a492b43fc4cbfa8ce0f.webp

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

059550e75b8639d7d10fb0f5099c3c67.webp


(左脸颊x坐标,左眼眉y坐标),这组坐标即是我们要将眼镜图片以左上角为基准,贴过来的图片。
对比看下,眼镜腿是不是差不多在红框的位置:
ae4208b5de6449ad989d63f6cb76f34b.webp

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


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

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

而这个因子如何计算?(需要点基础数学知识)
需要得知眼镜原图片的长像素,比如我的现在眼镜原图像素为:

5796a5b53888bf2ce6b56a314d211c55.webp


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

76075814dc62b244cbf2bf0753eae8c4.webp


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

案例中,缩放因子 = 446/1586 ≈ 0.28
4. 组合图片
以上所有步骤准备好后,直接将眼镜图片组合到周董图片上即可。

4

置换图片,呈现结果


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


8ee3450b434df71f7b553061ba4b4eb5.webp


自动戴眼镜,成像之后:


c15bef73eb4d2d3c7f637c57a3490beb.webp


5

总结


思路给大家梳理了一遍,其实熟悉我写作风格的小伙伴应该明白,编程思路有了,实现并不是难题。
其中需要动脑子的地方,就是关于”附属品“图片的等比例缩小,有个简单的小算法,还有一个地方就是"附属品"图片的左上方坐标,对标到人脸的左脸颊上方。
对于代码的细节,我没有在文章中写出来,写出来估计会很枯燥,如果你对源代码感兴趣,老规矩,我上传到 github 了。

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


题图 - pexels - Philipp Birmes



▼往期精彩回顾▼如何用技术手段将图片背景变为透明?用Python鬼畜特朗普照片,了解下?




浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报