首页IT科技ai美颜是什么(记录–从AI到美颜全流程讲解)

ai美颜是什么(记录–从AI到美颜全流程讲解)

时间2025-05-22 10:37:41分类IT科技浏览6258
导读:这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助...

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

配置 manifests

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

相对于上篇用摄像头来做效果,本文用gif图来代替摄像头的输入的视频流,如果想用摄像头实现,可以参考:

用开源212点人脸关键点实现Android人脸实时打码 zhuanlan.zhihu.com/p/161038093

处理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); }

此代码来源于github.com/DingProg/Ma…

渲染

传过来的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://juejin.cn/post/6855129006367309832

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
xp系统任务栏很宽(在xp系统中,为什么任务栏无法显示在最前面?) seo网站排名优化快速排(探秘SEO:网站排名的秘密武器)