Python实现人脸带墨镜效果
特别声明:《Python实现人脸带墨镜效果》转载于网络,并不代表傻大方资讯网的立场。
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
DEAL WITH IT是这样一个效果,眼镜从屏幕外飞进来,带在用户的脸上。这种效果的最佳实例是以一种独特的方式完成的。
今天,我们将编写一个生成器,该生成器使用任何有面部的静态图像作为输入。如果你想构建一个该效果的API,或者想以视频为输入来制作该效果,那么本文的代码是一个很好的开端。
我从Erik Taheri那里获得本文的灵感,而他写的是适用于浏览器的这个效果的Javscript版本。
在本文的结尾处,我还加入了一个使用OpenCV从摄像头实时获得效果的版本。
人脸识别和创建Gif的工具我们将使用Dlib的get_frontal_face_detector,和Snapchat的镜头效果一文中用到的68点形状预测模型。
程序将接受命令行参数来获取输入图像。然后,使用Dlib中的人脸识别算法来查看输入的图像中是否有人脸。如果有的话,将为每个人脸创建一个最终位置,该位置是眼镜应该落到的位置。
然后,我们调整和旋转眼镜来适应每个人的脸。我们将使用从Dlib的68点模型返回的点集来找到眼睛的质心,以及它们之间的空间旋转角度。
我们找到眼镜的最终位置和旋转角度后,可以制作眼镜从屏幕顶端进入的gif。我们将使用MoviePy的make_frame函数绘制gif。
自动生成Gif的架构该应用程序的结构非常简单。我们首先获取图像,然后将其转换为灰度NumPy数组。得到NumPy数组后,我们可以将要检测的图像传递给面部定位预测模型。
返回人脸方向后,我们可以选出眼睛,以及缩放和旋转眼镜架以适应人脸。
我们可以积累一组面孔和它们的最终位置,并将它们添加到列表中。
最后,通过这个列表,我们可以用MoviePy创建一个绘制路线,然后生成动态gif。
编码规划好代码结构后,我们下一步需要逐步构建代码。
首先导入所有的工具,并且从命令行得到一张图像:
有了这个,我们可以调整图像以适应更小的宽度,因此我们的gif不会很大,而且要导入面部识别和形状预测。
我们也可以打开要贴在图像上的眼镜和文本。
此时,我们还应该检测图像中是否有任何人脸。如果没有,我们应该立即退出。
好极了!现在,我们可以遍历每个检测到的人脸,并建立一个缩放和旋转眼镜列表,列表也包括眼镜的最终位置。
有了最终位置以及缩放和旋转的眼镜,我们可以把影片放在一起。我们会为整个gif设置一个持续时间,以及阻止眼镜掉下来的时间,以便我们可以把“deal with it”文本显示在屏幕上。
你会注意到,我使用了一个文本叠加的图像,而不是Pillow内置的文本绘制功能。我这样做是因为Pillow没有内置文本的勾画功能。不勾画,文字在更加明亮的图像上难以辨认。
最后,我需要在MoviePy中创建一个VideoClip对象,并传入动态生成的帧和FPS。
有了这个,我们完成了!
现在,我们已经有了一套生成gif的基础代码,改写代码实时地与摄像头协同工作并不困难。
我们可以使用OpenCV作为源图像,并用计数器追踪动画,而不是从命令行加载源图像。这样做的新代码非常简单,核心代码:
这创建了一个计数器,并且通过运行了多少帧来追踪时间。使用这个,我们可以让眼镜到最终位置。用户如果按下d键,我们开始动画。
你可以在Github上阅读其余的代码。(http://github.com/burningion/automatic-memes)
下一步我们已经成功地构建了程序的第一部分,它可以作为一个API来自动生成效果。
把我们程序连接到Django之类的东西,我们可以显示一个网页,允许用户上传他们自己的图像,并得到完整的效果。
像youtube-dl这样的东西,我们可以让用户粘贴YouTube的网址视频来自动生成效果。
很酷吧,要不要自己试一试?
译者:张新英
- V神(Vitalik Buterin)希望以太社区基金实现炒作
- 3D sensing 人脸识别,全球光电子巨头Lumentum最新财年会议纪要
- 天津:169家重点监测企业初一实现销售收入1.7亿元
- 绽放冬奥赛场,斯洛文尼亚实现奖牌突破
- 100多年前,杭州就有了\"地铁\"!这个地方实现轨交、公交双覆盖
- 银行存款方式你懂吗?怎么实现正确理财日入上百
- 为什么说 Python 和 Pygame 最适合编程初学者 | Linux 中国
- 最近很容易被意外之财砸中的星座,你的发财梦终于要实现了
- 78岁天津股神曝:“三不卖七不买”,字字珠玑,背熟5句实现千万本金
- 蜜蜂养殖技术|对实现规模化养蜂的八点建议