iOS的原生框架Vision实现了瘦脸和大眼效果。

一般会在短视频项目中使用类似Face++的商业sdk来实现瘦脸和大眼特效。在苹果的原生框架视觉中也应该可以识别人脸,提取面部特征点。没想到很顺利。我参考了网上的相关算法,一个小时就达到了效果。

Vision和Face++的比较:

1.Vision原生框架,体积小,免费;Face++需要付费,包包50 m左右。

2.视觉要求比ios11多,而Face++好像没有。

3.视觉检测到的关键点数量在iphone 5S上是74个,在iphone7上是74个,在iphone XS上是87个。Face++检测106个关键点。

4.视觉特征点好像有点浮动(稳定性一般),边缘检测不是很准。Face++特征点应该比较准确。

愿景正式文件

Face++官方文档

1.使用GPUImageVideoCamera收集相机数据。

2.将采集到的数据CVPixelBufferRef发送给Vision进行处理,得到人脸特征点。

3.在GPUImage的滤镜链中加入了自定义的瘦脸和大眼滤镜。

4.在自定义滤镜中重写-(void)rendertotexturewithcvertices:(constglfloat *)Vertices纹理坐标:(const GL float *)纹理坐标方法,并将特征点发送到芯片着色器进行处理。

5.着色器中使用了人脸提升和大眼相关算法:圈内放大算法、圈内缩小算法和定点拉伸算法。算法原理分析

6.最后通过GPUImageView显示出来。

1.将采集到的原始图像数据CVPixelBufferRef发送到Vision进行处理。

2.视觉提取人脸特征点时,需要注意特征点的坐标变换。

3.正在处理FaceBeautyThinFaceFilter过滤器中的特征点。

4.特征点数据在芯片着色器中处理。

第一张是原图,第二张是瘦脸大眼睛的效果。可见大眼效果不自然是因为系数设置的比较大。

1.如图,取出左眼瞳孔特征点72的坐标和上特征点13的坐标。

2.以瞳孔72为中心,以72到13之间距离的5倍为半径,确定放大范围。

3.根据圆内的放大算法,像素离圆心越近,向圆外偏移越大,像素离圆心越远,向圆外偏移越小。所以眼睛纵向拉伸的程度是很明显的。而且可以实现放大区域和未放大区域之间的平滑过渡。

4.其他的圆内缩小和定点拉伸的算法其实都差不多,这里就不赘述了。

Github:演示地址

欢迎留言或私信讨论问题和明星,谢谢~