Android OpenGLES滤镜开发之大眼效果

前言

在很多美颜相机啊,抖音啊,都会有一些放大眼睛的效果,今天就来实现如何放大眼睛。

思路

1、首先使用OpenCV定位到人脸

2、根据定位到的人脸去检测人脸关键点,进而获取到人眼睛的位置。

3、根据眼睛位置,对眼睛进行放大。

实现

定位人脸

人脸的定位追踪,在之前文章中已经写过OpenCv实现人脸追踪 当时是在xCode上写的,把里面的代码移植到Android中就可以了,这个是C写的,所以需要移植到JNI中。这里的人脸模型,我采用的是OpenCV中提供的,当然也可以自己去训练模型。

检测人脸关键点


人脸关键点的检测,有很多三方的sdk,比如说face++等等,都是要收费的,face++是检测了68个关键点,这68个关键点都不是随意分布的,都是有规律的。如下图:

但是像face++这种,都是需要收费的,我从GitHub上找了一个免费的叫SeetaFaceEngine它这个里面有三个模块:人脸检测模块(SeetaFace Detection)、面部特征点定位模块(SeetaFace Alignment)以及人脸特征提取与比对模块(SeetaFace Identification)。这里我用到的是SeetaFace Alignment,用来检测人脸的关键点。

它这里面并不是定位了68个关键点,而是定位了5个关键点,即左眼(0)、右眼(1)、鼻子(2)、嘴巴左边(3)、嘴巴右边(4),这个分布也是有规律的,并不是随便的点。代码如下:将定位到的人脸,送去进行关键点的检测




在创建一个数组,将关键点数组里的值赋值给它,在传递给java层


放大眼睛

这里是根据网上论文中的一个公式实现的,http://www.gson.org/thesis/warping-thesis.pdf, 大概在45页左右有个这样的描述,以及公式,就是根据这个来实现的。


这个公式是什么意思呢?这个公式求出的值是采集的改变后的点距离眼睛中心点的位置,rmax表示的是最大放大的区域,r表示原来的点距离眼睛中心点的位置,a表示的是放大系数,所以当a=0的时候,公式的结果就是r,也就是没有变化,不放大。

原理是什么呢,就是在片元着色器,把眼睛周边的需要放大的点取值成对应的眼睛内部的点的值,然后把这个值的坐标赋值给gl_FragColor,这样就完成了眼睛的放大;

片元着色器:



效果图


你可能感兴趣的:(Android OpenGLES滤镜开发之大眼效果)