Python实现人脸带墨镜效果

  • 内容
  • 评论
  • 相关

Python实现人脸带墨镜效果

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

DEAL WITH IT是这样一个效果,眼镜从屏幕外飞进来,带在用户的脸上。这种效果的最佳实例是以一种独特的方式完成的。

今天,我们将编写一个生成器,该生成器使用任何有面部的静态图像作为输入。如果你想构建一个该效果的API,或者想以视频为输入来制作该效果,那么本文的代码是一个很好的开端。

我从Erik Taheri那里获得本文的灵感,而他写的是适用于浏览器的这个效果的Javscript版本。

在本文的结尾处,我还加入了一个使用OpenCV从摄像头实时获得效果的版本。

人脸识别和创建Gif的工具

Python实现人脸带墨镜效果

我们将使用Dlib的get_frontal_face_detector,和Snapchat的镜头效果一文中用到的68点形状预测模型。

程序将接受命令行参数来获取输入图像。然后,使用Dlib中的人脸识别算法来查看输入的图像中是否有人脸。如果有的话,将为每个人脸创建一个最终位置,该位置是眼镜应该落到的位置。

然后,我们调整和旋转眼镜来适应每个人的脸。我们将使用从Dlib的68点模型返回的点集来找到眼睛的质心,以及它们之间的空间旋转角度。

我们找到眼镜的最终位置和旋转角度后,可以制作眼镜从屏幕顶端进入的gif。我们将使用MoviePy的make_frame函数绘制gif。

自动生成Gif的架构

Python实现人脸带墨镜效果

该应用程序的结构非常简单。我们首先获取图像,然后将其转换为灰度NumPy数组。得到NumPy数组后,我们可以将要检测的图像传递给面部定位预测模型。

返回人脸方向后,我们可以选出眼睛,以及缩放和旋转眼镜架以适应人脸。

我们可以积累一组面孔和它们的最终位置,并将它们添加到列表中。

最后,通过这个列表,我们可以用MoviePy创建一个绘制路线,然后生成动态gif。

编码

规划好代码结构后,我们下一步需要逐步构建代码。

首先导入所有的工具,并且从命令行得到一张图像:

Python实现人脸带墨镜效果

有了这个,我们可以调整图像以适应更小的宽度,因此我们的gif不会很大,而且要导入面部识别和形状预测。

我们也可以打开要贴在图像上的眼镜和文本。

此时,我们还应该检测图像中是否有任何人脸。如果没有,我们应该立即退出。

Python实现人脸带墨镜效果

好极了!现在,我们可以遍历每个检测到的人脸,并建立一个缩放和旋转眼镜列表,列表也包括眼镜的最终位置。

Python实现人脸带墨镜效果

有了最终位置以及缩放和旋转的眼镜,我们可以把影片放在一起。我们会为整个gif设置一个持续时间,以及阻止眼镜掉下来的时间,以便我们可以把“deal with it”文本显示在屏幕上。

Python实现人脸带墨镜效果

你会注意到,我使用了一个文本叠加的图像,而不是Pillow内置的文本绘制功能。我这样做是因为Pillow没有内置文本的勾画功能。不勾画,文字在更加明亮的图像上难以辨认。

最后,我需要在MoviePy中创建一个VideoClip对象,并传入动态生成的帧和FPS。

Python实现人脸带墨镜效果

有了这个,我们完成了!

实时动态表情包


现在,我们已经有了一套生成gif的基础代码,改写代码实时地与摄像头协同工作并不困难。

我们可以使用OpenCV作为源图像,并用计数器追踪动画,而不是从命令行加载源图像。这样做的新代码非常简单,核心代码:

Python实现人脸带墨镜效果

这创建了一个计数器,并且通过运行了多少帧来追踪时间。使用这个,我们可以让眼镜到最终位置。用户如果按下d键,我们开始动画。

你可以在Github上阅读其余的代码。(https://github.com/burningion/automatic-memes)

下一步

我们已经成功地构建了程序的第一部分,它可以作为一个API来自动生成效果。

把我们程序连接到Django之类的东西,我们可以显示一个网页,允许用户上传他们自己的图像,并得到完整的效果。

像youtube-dl这样的东西,我们可以让用户粘贴YouTube的网址视频来自动生成效果。

很酷吧,要不要自己试一试?


英文原文:https://dev.to/burningion/deal-with-it-in-python-with-face-detection-chi
译者:张新英


始发于微信公众号:Python程序员