Android OpenGLES滤镜开发之大眼效果

本文介绍了如何使用OpenCV和OpenGLES在Android上实现大眼滤镜效果。首先通过OpenCV定位人脸,接着使用SeetaFaceEngine检测人脸关键点,特别是眼睛位置。然后,根据特定公式放大眼睛区域,最后在片元着色器中应用变换完成放大效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

思路

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::
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值