利用美颜sdk,除了能实现磨皮、美白、祛痘、动态贴纸等特效外,还能通过人脸变形算法达到瘦脸、大眼、美型。当然,如果将人脸变形算法中的某些参数加以修改,就能够产生另外一种神奇的特效,那就是哈哈镜特效。以美狐美颜为例,今天就来简单讲讲哈哈镜特效是如实现的。
一、哈哈镜特效实现总概
哈哈镜特效,就如现实中的凸面镜或者凹面镜,凹面镜把人变瘦了,而凸面镜吧人变胖了。那么反应在图片或者视频上,就是对图片或者视频局部的缩放。需要注意的是,这里指的不是整体的放大或者缩小,而是某个区域被放大或缩小,在美颜中可以理解为被人脸检测出的区域。为了简单说明,我们接下来以圆形区域加以说明。
二、举例说明哈哈镜特效实现算法
上面说了,我们以某个圆形区域为例,圆形区域的变形,无非存在两种情况,圆形区域的中心被放大,周匝被缩小,或者是中心被缩小,周匝被放大。而且从中心到周匝的缩小或者放大过程是逐渐变化的,不是突然从缩小变成了放大。
为此,可以在坐标轴上构建一条曲线来说明问题。以中心缩小,周匝放大为例。
从上图中可以看到,横坐标是目标图像上的点到圆心的距离,纵坐标是原始图像上的点到圆心的距离,蓝线是基准线,而红线代表的就是图像扭曲后的图像图像,比如从图像上看,目标图像上距离圆心30左右的点,在原始波形上是距离50左右的点,这个意思就比较明显了,就是中心区域被缩小了。
至于如何构造出这么一条曲线,恐怕就是代码中的数学算法所要考虑的事情了,不过要必须说明的两点是,红线和蓝线的起点和终点必须是相同的,这个意思就是说形变只发生在一个圆形区域内,圆形区域外图像不形变,另外,连续数值所构建的导数是连续的,如果导数不连续,那么反映在图像上,则会导致从缩小到放大的变化过程不连续了。
接着,把上张图的两个曲线做除法,会得到一条新的曲线,分析得到,圆心位置的缩放比例是0.5。接下来,扫描图片上的点,看看像素是否在圆形区域内,即到圆心的距离是不是大于圆的半径,如果不在圆形区域内,就原封不动从原始图像上复制过来,如果是在圆形区域内,就根据上述方法找到它在原始图像上对应的位置,做插值。
最后将图像中的中心点找出,修改缩放比例,就能实现哈哈镜特效。而美颜sdk中的哈哈镜特效也主要是基于此实现的。如果您对美颜sdk开发感兴趣,欢迎咨询官方客服。
声明:本文由美狐原创,未经允许禁止转载,谢谢合作。