Android OpenGLES 实时美颜(磨皮)的优化(二)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OpenGLES 实时美颜(磨皮)的优化(二)相关的知识,希望对你有一定的参考价值。
参考技术A 在前一篇文章 Android OpenGLES 实时美颜(磨皮)的优化 ,我们已经介绍了关于实时美颜(磨皮)的一些优化点。但在实际的优化测试中发现,当处理器发热之后,就无法保证预览帧率了,主要还是高斯模糊处理的数据量比较大导致。因此,我们需要寻找新的磨皮方法。目前市面上关于磨皮方法有好多种,使用PS磨皮经常用到的方法包括高反差保留、高低频、中性灰以及双线性等。其中中性灰和双线性的效率一般,因此,我们从高反差保留、高低频这两种方法中选择。这里选择使用高反差保留法做磨皮处理,PS中的高反差保留法进行磨皮,随手一搜便能找到很多文章,比如:
https://jingyan.baidu.com/article/455a99504d568fa1662778d6.html
接下来,我们尝试着实现文章中讲到的过程。
关于高斯模糊的优化,可以参考本人的文章:
OpenGLES滤镜开发汇总 —— 高斯模糊实现以及优化
对于人像进行高斯模糊,我们设计一个11x11的高斯算子对图像进行高斯模糊,shader如下:
vertex shader :
fragment shader:
经过以上的shader进行高斯模糊处理之后,我们得到这样一张高斯模糊图像:
在PS的高反差保留磨皮方法中,高反差保留磨皮混合采用的是强光模式,计算公式为:color = 2 * color1 * color2。因此,我们设计出这样一个高通滤波器,其shader如下:
fragment shader:
经过高通滤波器之后,我们得到这样一个纹理图像:
可以看到,经过三通道强光混合处理后,痘印、边沿等地方都清晰起来了。强光的程度,一般是3的倍数,这里取24倍。
到这一步,其实我们已经得到了需要过滤颜色值,但在这一张图中,也把边沿的颜色差值包含进来了。我们接下来需要过滤掉边沿的颜色差值。这样在后续的处理中,我们可以保留边沿的细节不被模糊掉。因此接下来,我们需要将经过高通滤波得到的纹理,再做一次高斯模糊。不过这一次不能11 x11 这么大的高斯算子,我们选择一个 5 x 5 大小的高斯算子。高斯模糊的shader 如下:
vertex shader:
fragment shader:
将高通滤波器得到的纹理,经过高斯模糊处理后,得到这样一张纹理:
对比高通滤波器处理后的纹理,边沿细节变得模糊了,而且,需要过滤的颜色差值仍旧保留着。到这一步,我们就得到了做磨皮处理的前置纹理。接下来就是高反差保留磨皮的最后也是最重要的一步。
经过前面的处理,我们得到一张输入图片的高斯模糊纹理,以及一张高反差保留的高斯模糊纹理。我们使用这两张纹理,通过比较蓝色通道,计算出需要磨皮的实际强度值,与原图进行混合处理,然后输出最终的纹理。shader如下所示:
经过上面的处理之后,我们就得到磨皮处理的结果如下:
可以看到,经过高反差保留磨皮后的结果,磨皮效果还不错,而且720P磨皮处理时,在高通骁龙625处理器上,经过高反差保留磨皮之后,预览帧率能够保持在30FPS左右。我们可以看到,边沿细节还是不够明显,所以,我们可以使用USM锐化增强边沿细节部分。这篇文章就不讲解USM锐化的实现了。
详细实现过程,可以参考本人的开源相机项目:
CainCamera
CainCamera的FilterLibrary中有经过优化后的实时美颜(磨皮)实现。
视频实时自然美颜, 无惧素颜上镜
华为HMS Core 视频编辑服务依托自身AI技术的核心优势,在最新版本HMS Core 6.8.0中上线了全新的视频美颜功能,能对指定图片或视频中的人脸实现磨皮、美白、大眼、瘦脸的美颜效果,适用于直播、相机、视频剪辑、图片处理等场景中,打造独特自然的美颜效果。
HMS Core视频美颜功能在技术上使用CPU+NPU+GPU异构并行框架,支持实时美颜处理,算法跑得更快但系统功耗降低,50fps+端到端高效处理,能在10ms内完成视频中最多2个人脸(面积占比较大的2个人)的处理(数据源于华为内部测试)。使用855点稠密五官定位,精准识别人脸,避免人脸移动过快或角度过大时,美颜效果变形。针对美颜效果,采用面部精细分区,结合中性灰自然磨皮,更加自然真实。
另外,为满足用户的更多个性化需求,华为开放磨皮、美白、大眼、瘦脸美颜效果的多级调节功能,用户可根据需求自行调节效果,助力开发者以较低成本开发优秀的视频美颜效果。
美颜效果
下面我们就一起来实操一下如何接入华为视频编辑服务,实现视频美颜功能。
开发步骤
1. 开发准备
详细准备步骤可参考华为开发者联盟官网。
2. 集成准备
设置应用的鉴权信息。可以通过api_key或者Access Token来设置应用鉴权信息。
(推荐)通过setAccessToken方法设置Access Token,在应用启动时初始化设置一次即可,无需多次设置。
HVEAIApplication.getInstance().setAccessToken("your access token");
获取Access Token可参见基于OAuth 2.0开放鉴权客户端模式。
通过setApiKey方法设置api_key,在应用启动时初始化设置一次即可,无需多次设置。
HVEAIApplication.getInstance().setApiKey("your ApiKey");
当您在AppGallery Connect上注册您的应用时,会给您的应用分配api_key,可参见添加当前应用的AppGallery Connect配置文件。
注意:请勿将api_key硬编码在代码中,同时不要将api_key存储在应用的配置文件中。建议您将api_key存储在云侧,运行时获取。
3. 美颜功能集成
// 创建美颜算法类实例
HVEAIBeauty hveaiBeauty = new HVEAIBeauty();
// 初始化美颜AI算法引擎
hveaiBeauty.initEngine(new HVEAIInitialCallback()
@Override
public void onProgress(int progress)
// 初始化美颜AI算法引擎进度
@Override
public void onSuccess()
// 初始化美颜AI算法引擎成功
@Override
public void onError(int errorCode, String errorMessage)
// 初始化美颜AI算法引擎失败
);
// 初始化美颜算法opengl运行环境,需在opengl渲染线程里调用
hveaiBeauty.prepare();
// 设置需美颜处理的纹理的宽高(textureWidth:纹理的宽;textureHeight:纹理的高),初始化或纹理有变化后调用,需在opengl渲染线程里调用
// resize参数为需要处理的纹理宽高,取值需要大于0
hveaiBeauty.resize(textureWidth, textureHeight);
// 美颜参数配置,磨皮,美白,瘦脸,大眼,亮眼, 美颜程度范围:[0, 1]
HVEAIBeautyOptions options = new HVEAIBeautyOptions.Builder().setBigEye(1)
.setBlurDegree(1)
.setBrightEye(1)
.setThinFace(1)
.setWhiteDegree(1)
.build();
// 更新美颜参数,初始化或有修改后更新
hveaiBeauty.updateOptions(options);
// 进行美颜处理,在opengl渲染线程里每帧调用,(inputTextureId:输入的纹理ID;outputTextureId:输出的纹理ID)
// 请确保输入正向朝上的人脸的纹理。
int outputTextureId = hveaiBeauty.process(inputTextureId);
// 释放美颜AI算法引擎
hveaiBeauty.releaseEngine();
HMS Core视频编辑服务除了支持视频美颜,还提供基础视频编辑、专属滤镜、一键染发、人物追踪、AI着色、动态照片、精彩片段、一键动效、人脸遮挡、一键微笑、目标分割等视频创作能力,开发者可依据应用场景,在App中轻松完成视频功能的集成。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
以上是关于Android OpenGLES 实时美颜(磨皮)的优化(二)的主要内容,如果未能解决你的问题,请参考以下文章