前言
在很多美颜相机啊,抖音啊,都会有一些放大眼睛的效果,今天就来实现如何放大眼睛。
思路
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),这个分布也是有规律的,并不是随便的点。代码如下:将定位到的人脸,送去进行关键点的检测
if (faces.size()){
Rect face = faces[0];
rects.push_back(Rect2f(face.x,face.y,face.width,face.height));
//关键点定位
//保存5个关键点
//0:左眼 1:右眼 2:鼻头 3:嘴巴左边,4 :嘴巴右边
seeta::