android照片美颜项目_抖音美颜效果开源实现,从AI到美颜全流程讲解
美颜和短视频
美颜相关APP可以说是现在手机上的必备的软件,例如抖音,快手,拍出的“照骗”和视频不加美颜效果,估计没有人敢传到网上。很多人一直好奇美颜类APP是如何开发出来的。本文就大致讲一下在Android上如何实现实时修改唇色效果。其它功能例如美白,腮红都是类似的原理
下图的唇色修改效果就是想实现的功能
美颜原理
美颜是的基本原理就是深度学习加计算机图形学。深度学习用来人脸检测和人脸关键点检测。计算机图形学用来磨皮,瘦脸和画妆容。一般在Android上使用OpenGLES,IOS为Metal。由于计算机图形学概念较多和复杂,本文中用Android的Canvas替代。
人脸检测 & 人脸关键点人脸检测指的是对图片或者视频流中的人脸进行检测,并定位到图片中的人脸。
人脸关键点检测是对人脸中五官和脸的轮廓进行关键点定位,一般情况下它紧接在人脸检测后。
我们将使用TengineKit来实现实时大红唇效果。
TengineKit
免费移动端实时人脸212关键点SDK。是一个易于集成的人脸检测和人脸关键点SDK。它可以在各种手机上以非常低的延迟运行。OAID/TengineKitgithub.com
TengineKit 效果图
实现口红效果
配置 Gradle
Project中的build.gradle添加
repositories {
...
mavenCentral()
...
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
主Module中的build.gradle添加
dependencies {
...
implementation 'com.tengine.android:tenginekit:1.0.5'
...
}
配置 manifests
相对于上篇用摄像头来做效果,本文用gif图来代替摄像头的输入的视频流,如果想用摄像头实现,可以参考:月球基地蒋司令:用开源212点人脸关键点实现Android人脸实时打码,内附Github地址zhuanlan.zhihu.com
处理Gif传过来的图片流
首先我们先初始化TengineKit:选用normal处理模式
打开人脸检测和人脸关键点功能
设置图片流格式为RGBA
设置输入图片流的宽高,此处为gif图的预览宽高
设置输出图片流的宽高,此处为GifImageView的宽高,此处和gif一致,所以用gif图的宽高代替
com.tenginekit.Face.init(getBaseContext(),
AndroidConfig.create()
.setNormalMode()
.openFunc(AndroidConfig.Func.Detect)
.openFunc(AndroidConfig.Func.Landmark)
.setInputImageFormat(AndroidConfig.ImageFormat.RGBA)
.setInputImageSize(facingGif.getGifWidth(), facingGif.getGifHeight())
.setOutputImageSize(facingGif.getGifWidth(), facingGif.getGifHeight())
);
通过关键点得到嘴唇的形状
Path getMouthLandmarks(FaceLandmarkInfo fi){
Path outPath = new Path();
outPath.moveTo(fi.landmarks.get(180).X,fi.landmarks.get(180).Y);
for(int i = 180; i < 189; i++){
outPath.lineTo(
fi.landmarks.get(i).X,
fi.landmarks.get(i).Y
);
}
for(int i = 204; i >= 196; i--){
outPath.lineTo(
fi.landmarks.get(i).X,
fi.landmarks.get(i).Y
);
}
outPath.close();
Path inPath = new Path();
inPath.moveTo(fi.landmarks.get(180).X,fi.landmarks.get(180).Y);
for(int i = 195; i >= 188; i--){
inPath.lineTo(
fi.landmarks.get(i).X,
fi.landmarks.get(i).Y
);
}
for(int i = 204; i <= 211; i++){
inPath.lineTo(
fi.landmarks.get(i).X,
fi.landmarks.get(i).Y
);
}
outPath.op(inPath, Path.Op.DIFFERENCE);
return outPath;
}
给嘴唇涂上颜色
public static void drawLipPerfect(Canvas canvas, Path lipPath, int color, int alpha) {
//most 70% alpha if (alpha > 80) {
alpha = (int) (alpha * 0.9f + 0.5f);
}
alpha = (int) (Color.alpha(color) * ((float) alpha / 255)) << 24;
color = alphaColor(color, alpha);
final PointF position = new PointF();
float blur_radius = 5;
Bitmap mask = createMask(lipPath, color, blur_radius, position);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));
canvas.drawBitmap(mask, position.x, position.y, paint);
}
渲染
传过来的bitmap为RGB_565,需要转为标准的RGBA格式
facingGif.setOnFrameAvailable(new GifImageView.OnFrameAvailable() {
@Override
public Bitmap onFrameAvailable(Bitmap bitmap) {
// bitmap RGB_565
Bitmap out_bitmap = Bitmap.createBitmap(
facingGif.getGifWidth(),
facingGif.getGifHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(out_bitmap);
canvas.drawBitmap(bitmap, 0, 0, null);
bitmap.recycle();
byte[] bytes = bitmap2Bytes(out_bitmap);
Face.FaceDetect faceDetect = com.tenginekit.Face.detect(bytes);
if(faceDetect.getFaceCount() > 0){
faceLandmarks = faceDetect.landmark2d();
if(faceLandmarks != null){
for (int i = 0; i < faceLandmarks.size(); i++) {
Path m_p = getMouthLandmarks(faceLandmarks.get(i));
LipDraw.drawLipPerfect(canvas, m_p, Color.WHITE, 100);
}
}
}
return out_bitmap;
}
});
效果对比
建议
有兴趣的同学可以在当前项目的基础上面深化,本文的许多代码也来源于此,具体可以参考https://github.com/DingProg/Makeupgithub.com
更进一步想尝试商业级的美颜效果可以参考https://github.com/CainKernel/CainCameragithub.com
参考https://github.com/OAID/TengineKitgithub.comhttps://github.com/DingProg/Makeupgithub.comfelipecsl/GifImageViewgithub.com
源码https://github.com/jiangzhongbo/TengineKit_Demo_Face_Beautygithub.com
系列月球基地蒋司令:用开源212点人脸关键点实现Android人脸实时打码,内附Github地址zhuanlan.zhihu.com
—完—
@GitHub Hunt · 发现有趣,好玩,硬核的开源项目
有收获的朋友,欢迎赞同、关注、分享三连 վ'ᴗ' ի ❤
android照片美颜项目_抖音美颜效果开源实现,从AI到美颜全流程讲解相关推荐
- android打开视频噔_抖音按手指喝酒_抖音钢琴曲前奏噔噔噔
你如果想赚点零花钱的加我微信:422591055.首次咨询送"女朋友"一个. [抖音按手指喝酒]--按手指喝酒app 抖音按手指喝酒游戏是一款抖音上十分火爆的taproulette ...
- Android评论框,类似抖音评论弹框
项目github地址:CommitDialogCommentDialog 这是一个Android评论框,类似抖音评论弹框 最近公司有个需求,就是仿抖音弹窗评论,我也是在网上找了一些资料,并未找到有人实 ...
- 基于android的高仿抖音,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- 副业项目:抖音车载U盘赚钱项目
我是浩哥,今天来给大家聊聊抖音车载U盘赚钱项目. 抖音车载U盘项目是个老项目,有人说它过时了,有人说它是个抱利项目. 小A和小B都是做车载音乐卖U盘,小A年入几十万,而小B没流量,不赚钱. 这是什么原 ...
- android仿抖音礼物列表实现,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- 抖音只能上下滑动吗_抖音只能上下滑动吗_实现仿抖音视频滑动的两个方案
0.效果图 1.先来看一下需求 1. 项目中的视频播放,要求实现抖音那种竖直方向一次滑动一页的效果.滑动要流畅不卡顿,并且手动触摸滑动超过1/2的时候松开可以滑动下一页,没有超过1/2返回原页. 2. ...
- Android VideoView 视频播放器 仿抖音
前言 最近项目有个需求 , 做个类似抖音的视频效果. 又因为包大小的问题不使用第三方SDK,所以使用原生的VideoView开发了一下, 搭配RecyclerView和PageSnapHelper来实 ...
- android仿抖音关注列表,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- Android高仿抖音滚动聊天,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
最新文章
- 【java】兴唐第二十九节课作业
- Swift初探 1 helloWord
- 【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
- rest服务swagger_使用Swagger轻松记录您的Play Framework REST API
- 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置
- 图片裁剪(cropperjs)
- nodejs 图片处理模块 rotate_如何针对数据不平衡做处理?
- 在chrome开发者工具中观察函数调用栈、作用域链、闭包
- 网络编程之 哈希表原理讲解 来自老司机的源码
- 【语音处理】基于matlab GUI语音时域频域频谱图分析【含Matlab源码 527期】
- 挑战云主机战:学习使用云端服器象棋云库
- matlab中如何求导数,matlab如何求导数
- 视频编码中的PAFF和MBAFF的区别 转自:http://blog.csdn.net/kerryhung/article/details/4433256
- 普通路由器DMZ主机设置及访问方法
- Eclipse TPTP平台配置详细步骤Ver1.0
- 计算机中mu的作用是什么,计算机上M+ M- MU GT等分别代表意思.doc
- SOCKS5实现(一)
- ZJOI2017 仙人掌
- 计算机网络基础——应用层(上云必看)
- Git push之后回滚
热门文章
- 【docker】镜像的导出保存及载入
- 咖啡专家告诉你,为什么你冲的咖啡和店里不同?
- 无法把代码推到gitee故障解决(OpenSSH签名算法不兼容)
- python中的转义字符有哪些_Python中的转义字符
- 服务器的系统文件怎么恢复出厂设置,电脑恢复出厂设置有哪些方法?
- 一篇文章搞定大数据安装(Hadoop、zookeeper、Spark、HBase、Hive)———附带详细步
- 浅析,你的店铺为什么关闭?
- 谷歌开发者帐号申请流程_2020年针对软件开发人员角色的Google面试流程
- string字符串内容倒叙_Java实现字符串倒序输出的常用方法小结
- 【云原生 | 07】官方镜像仓库Docker Hub和企业级私有镜像仓库Harbor