现今较火的抖音上有一个十分有趣的特效,其可以自动检测出人脸并且放置墨镜和烟卷,鉴于此,想自己实现动手实现以下该特效的制作。
二、工作环境
Python 3.6,opencv+Dlib,Windows操作系统,pycharm
三、流程
从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像。
程序启动后,根据监听器信息,使用一个while循环,不断的加载视频图像,然后返回给opencv工具呈现图像信息。
创建一个键盘事件监听,按下"d"键,则开始执行面部匹配,并进行面具加载(这个过程是动态的,你可以随时移动)。
面部匹配使用Dlib中的人脸检测算法来查看是否有人脸存在。如果有,它将为每个人脸创建一个结束位置,眼镜和烟卷会移动到那里结束。
然后我们需要缩放和旋转我们的眼镜以适合每个人的脸。我们将使用从Dlib的68点模型返回的点集来找到眼睛和嘴巴的中心,并为它们之间的空间旋转。
在我们实时获取眼镜和烟卷的最终位置后,眼镜和烟卷从屏幕顶部进入,开始匹配你的眼镜和嘴巴
假如没有人脸,程序会直接返回你的视频信息,不会有面具移动的效果。默认一个周期是4秒钟。然后你可以通过"d"键再次检测。
退出程序按下q键。
四、关键代码
创建面具加载服务类DynamicStreamMaskService及其对应的初始化属性:
![](https://img-blog.csdnimg.cn/img_convert/08988c71fa2560f52443f49d773a7e73.png)
读取摄像头视频流并转化为图象:
![](https://img-blog.csdnimg.cn/img_convert/703a490ce72ca8fa90a34797d772c13a.png)
实现人脸定位函数,及眼镜和烟卷的定位:
![](https://img-blog.csdnimg.cn/img_convert/c8080cf7d050452cfd0f6dd0048a141e.png)
![](https://img-blog.csdnimg.cn/img_convert/d5aea6469f44a093d38df3f95bcb511c.png)
![](https://img-blog.csdnimg.cn/img_convert/40b4bd89fa964bc37c06b14561e61df4.png)
接下来实现画图函数:
![](https://img-blog.csdnimg.cn/img_convert/2c0c1d4695f408301fa24c136f490126.png)
创建启动函数start:
![](https://img-blog.csdnimg.cn/img_convert/1d8dd485e18d76cc8c5bd527903d915e.png)
五、运行结果
运行后,首先会打开摄像头,然后按下键盘d键,就会看到墨镜和烟卷从屏幕上方出来,自动定位到眼睛和嘴巴。参考结果如下:
![](https://img-blog.csdnimg.cn/img_convert/7eb009b58208ecca42c1a81bdee2173e.png)
图片经过马赛克处理了。
注意
代码中需要调用 shape_predictor_68_face_landmarks.dat人脸库,需要下载,然后在代码调用处中指定路径即可。