大家新年快乐!!过年总是这么短暂,新年新气象,这篇文章本年年前准备发的,过年嘛,总会懒一些,哈哈哈哈。今天我们来简单实现一个嘴唇的贴纸功能,先看看效果。

其实大部分APP的完整功能包含脸部,鼻子,眼镜等的完整渲染,不过原理都类似,我就只用一个嘴唇来抛砖引玉了。看这篇文章之前,需要了解NDK、OpenGL ES的基本知识。

关于OpenGL ES 3.0的相机渲染

相机采集并渲染画面有很多种方式,但是我们因为要做画面的处理,肯定是选择自己拿到纹理来进行渲染。关于渲染的过程可以看这篇文章。 Android采集并使用OpenGL ES预览摄像头画面 。

人脸检测

通过OpenGL ES渲染,我们可以看到摄像头采集的画面了,然后我们要唇部的渲染肯定要只要人脸关键点的位置了,这里就需要人脸检测了,人脸检测市面上收费的有什么face++,商汤等等。这里我用的是这个
https://github.com/zeusees/HyperLandmark
速度还蛮快的,学习肯定是够用了,感谢提供的支持。我们可以看一下它的106个标点。
这样我们就可以知道采集之后的人脸数据了。

嘴唇贴纸

上面的东西准备完毕之后,我们还需要美妆的素材。这些东西可真是不好找,好在在腾讯爸爸的目录下搜刮了一个。大概看一下目录。一个滤镜是由多个图片素材和背景音乐组合而成的,管理他们的就是params.json这个文件了,当然今天我们大部分都用不到。
看一下lian.png,其实渲染上去就是我们平时使用的整体美妆这种效果。
json文件,可以找到脸部关键点的位置,为了节省篇幅,下面我省略了其他部分。

{"minAppVersion": 400,"blendAlpha": 1.0,"featureType": 0,"grayScale": 0,"blendMode": 1,"useMesh": 1,"facePoints": [145, 468,150, 498,156, 528,162, 561,169, 595,175, 622,181, 649,191, 695,203, 716,214, 738,238, 776,258, 793,277, 811,311, 843,351, 868,398, 876,445, 866,491, 841,528, 807,543, 788,558, 769,585, 734,595, 712,605, 690,611, 668,618, 645,624, 619,630, 592,631, 558,633, 524,638, 504,643, 484,199, 446,239, 444,280, 448,321, 456,362, 458,327, 433,283, 425,239, 425,595, 445,555, 444,515, 452,484, 457,438, 460,464, 435,508, 422,559, 422,241, 506,260, 518,285, 522,309, 520,336, 511,317, 493,287, 483,263, 489,291, 504,291, 502,558, 501,537, 516,511, 523,487, 521,460, 512,481, 492,508, 484,534, 488,508, 502,508, 500,370, 512,366, 600,340, 649,370, 668,400, 672,428, 666,458, 647,432, 601,430, 513,400, 636,312, 719,489, 717,335, 743,364, 759,399, 766,434, 758,464, 741,442, 736,401, 741,352, 736,346, 713,379, 710,401, 714,421, 713,454, 713,442, 729,400, 731,354, 727,341, 733,461, 728,400, 512,404, 460,400, 692,205, 205,398, 275,598, 197,400, 356]
,"shaderType": 8,"maxFaceCount": 2,"detectorFlag": 2,"faceExchangeImage": "lian.png"....
]}

这些都准备好了之后,想必大家都知道该如何渲染了吧。我们只需要将对应位置渲染到我们检测到的人脸位置即可,也就是先绘制人脸,再绘制图片,纹理的颜色点和人脸检测点一一对应采集即可。这里就来到我们传统的OpengGL绘制三角形时间,因为人脸点比较固定,我们将点一起传入之后,使用下标绘制的方式最好。这里我主要提两点需要注意的地方。

1、OpenGL的混合渲染

OpenGL不开启混合会导致后面渲染的完全覆盖掉之前的,这里我们使用的是

         glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

具体关于混合的选项,可以参考这里
https://learnopengl-cn.github.io/04 Advanced OpenGL/03 Blending/

2、人脸三角分割

我们不用每次去进行三角分割计算,只需要把索引点保存为数组,再绘制即可。我们将下图红线中的点来绘制三角形,将三角形索引点保存。这里我多绘制了下巴部分的三角形是因为如果只画嘴唇部位的三角形,会有棱角感,而且牙齿会显示不完整,所以我多绘制了下巴部分的三角形,一般来说是可以整张脸绘制的。

文章这里就结束了,感谢大家的阅读,代码因为一开始写的时候有一些健壮性的问题,功能虽然是实现了,可是有部分其他问题,之后我整理之后会放出来。代码大家可以参考https://github.com/CainKernel/CainCamera 这位大神的代码,非常不错的人脸滤镜功能。

Android简单实现嘴唇贴纸功能相关推荐

  1. Android简单调用相机Camera功能,实现打开照相功能

    在最开始接触Android相机功能之前,先来体验一下Android调用系统照相功能吧 核心代码 Intent intent = new Intent(); //调用照相机 intent.setActi ...

  2. android mysql实现登录注册_android简单登陆和注册功能实现+SQLite数据库学习

    android简单登陆和注册功能实现+SQLite数据库学习 发布时间:2018-07-04 17:23, 浏览次数:1027 , 标签: android SQLite 这里我只是建立了一个用简单的存 ...

  3. Android OpenGL+Camera2渲染(3) —— 大眼,贴纸功能实现

    Android OpenGL+Camera2渲染(1) -- OpenGL简单介绍 Android OpenGL+Camera2渲染(2) -- OpenGL实现Camera2图像预览 Android ...

  4. 拼图java监听器,Android 简单的实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开 ...

  5. android远程打电话,Android打电话功能 Android实战教程第三篇之简单实现拨打电话功能...

    想了解Android实战教程第三篇之简单实现拨打电话功能的相关内容吗,杨道龙在本文为您仔细讲解Android打电话功能的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android拨打电话 ...

  6. android动态贴纸实现原理,人脸动态贴纸sdk算法详解,人脸动态贴纸功能如何实现...

    原标题:人脸动态贴纸sdk算法详解,人脸动态贴纸功能如何实现 泛娱乐行业在互联网领域中发展趋势逐渐增强,而直播.短视频.视频社交等作为头部产品受到了众多用户的关注和喜爱.为了能够更好的满足用户体验,众 ...

  7. android如何实现用户注册功能,Android 实现简单的登录注册功能(SharedPreferences和SQLite)...

    最近恰好作了一个Android的登陆注册界面,将数据利用SharedPreferences或者SQLite绑定到Android程序中,实现简单的登录注册功能,本文未涉及到与服务器的交流.java 首先 ...

  8. 从零开始开发Android相机app(三)简单介绍图像滤镜功能

    目前章节 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机app(三)简单介绍图像滤镜功能 文 ...

  9. android实现打电话功能,Android之简单实现拨打电话功能的方法

    手机在我们的日常生活中是最常见的,它的功能是拨打电话和发送短信,那么在Android开发中,我们如何通过该程序拨打电话呢?爱站技术频道给出了Android之简单实现拨打电话功能的方法,一起来看看吧! ...

最新文章

  1. Spring Boot 实现定时任务的动态增删启停
  2. wordpress关闭博客评论的两种方法
  3. WSAStartup函数
  4. 将二叉搜索树转换为有序的双向链表
  5. ‘FactorAnalyzer‘ object has no attribute ‘analyze‘和fa.loadings改成fa.loadings报错解决
  6. c++ int8_t转int_Python 90行代码让微信地球转起来,你也可以!| 原力计划
  7. 光遇服务器维护都在干什么,光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔...
  8. Java时区处理初学者指南
  9. import python settings from_Python的Django框架中settings文件的部署建议
  10. 车辆出厂信息接口_航测遥感中心“漳州核电智慧工地管理系统平台”通过出厂验收...
  11. A股开盘:深证区块链50指数涨0.16%,顺利办跌停
  12. 云原生数据编排厂商Alluxio获5000万美元C轮融资
  13. linux中mysql基本操作
  14. 解决keil注册机在win10无法打开问题
  15. 【本站公告】近期Picasa图片没法查看的解决方案
  16. Linux搭建KMS激活服务器
  17. 08.15恒指/德指做单思路导图及晚盘前瞻
  18. 北上广深也不相信口水
  19. Ralph and Mushrooms (tarjan+dp)
  20. 买股不如买基?Python实现快速追踪基金的收益情况!谁还不是个买基高手?

热门文章

  1. 弘辽科技:掌握好这几个流量入口,店铺流量起爆
  2. 哈哈镜局部放大缩小图像处理算法
  3. Vue入门之组件化开发
  4. 问题记录:BMap api is not loaded
  5. 没有兴趣爱好,该怎么回答面试官?
  6. react添加键盘事件(react-hook 监听键盘事件)
  7. Python图像处理的一部分
  8. linux中groupadd的用法,linux 账户管理命令 useradd、groupadd使用方法
  9. scala 集合的contains 方法
  10. 如何在Java IDEA中安装阿里P3C以及使用说明