欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安卓开发 利用Face++实现人脸融合效果

程序员文章站 2022-04-16 13:32:18
...

由于最近有个需求,需要人脸融合,如是上网查了以下,发现Face++用的人挺多的,但是移动端的实现的blog都是直接复制他给的demo,还是挺繁琐的,于是自己看着api就写了一个小例子,希望让后面用的人方便一点。

本demo中用的第三方控件有OKHttp,Gson,EasyPermissions

而且人脸融合需要的两个api目前是免费的

上个效果图

安卓开发 利用Face++实现人脸融合效果安卓开发 利用Face++实现人脸融合效果

安卓开发 利用Face++实现人脸融合效果

步骤

1.先去Face++官网注册一个开发者账户,得到自己的key和Secret

安卓开发 利用Face++实现人脸融合效果

2.导入需要的第三方库

3.查看了解到自己需要的api有

安卓开发 利用Face++实现人脸融合效果安卓开发 利用Face++实现人脸融合效果

4.使用OKHttp去发送请求并得到返回值,具体见API

  new Thread(new Runnable() {
            @Override
            public void run() {
                File file = new File(Environment.getExternalStorageDirectory()+"模板文件地址");
                File file2 = new File(Environment.getExternalStorageDirectory()+"融合图片地址(人脸)");


                OkHttpClient client=new OkHttpClient();

                MultipartBody.Builder builder=  new MultipartBody.Builder().setType(MultipartBody.FORM);
                RequestBody requestBody=RequestBody.create(MediaType.parse("application/octet-stream"), file);

                builder.addFormDataPart("api_key","你的key");
                builder.addFormDataPart("api_secret","你的kecret");
                builder.addFormDataPart("image_file",file.getName(),requestBody);

                Request request = new Request.Builder()
                        .url("https://api-cn.faceplusplus.com/facepp/v3/detect")
                        .post( builder.build())
                        .build();


                try {
                    Response response=client.newCall(request).execute();
                    responseData=response.body().string();
                    Message message=Message.obtain();
                    message.what=1;
                    myhandler.sendMessage(message);//可以对返回的值进行查看
                } catch (IOException e) {
                    e.printStackTrace();
                }

                //接下来进行人脸融合,file1经过解析得到人脸的坐标,作为模板图(背景)
                //file2进行融合,脸为file2
                Gson gson=new Gson();
                //对json数据转化为对象
                Image image=gson.fromJson(responseData,Image.class);
                List<Faces> faces=image.getFaces();
                FaceRectangle rectangle=faces.get(0).getFace_rectangle();

                int top=rectangle.getTop();
                int left=rectangle.getLeft();
                int height=rectangle.getHeight();
                int width=rectangle.getWidth();
                String template_rectangle=top+","+left+","+height+","+width;

                MultipartBody.Builder builder2=  new MultipartBody.Builder().setType(MultipartBody.FORM);
                RequestBody requestBody2=RequestBody.create(MediaType.parse("application/octet-stream"), file2);

                builder2.addFormDataPart("api_key","你的key");
                builder2.addFormDataPart("api_secret","你的secret");
                //模板图,使用requestBody
                builder2.addFormDataPart("template_file",file.getName(),requestBody);
                builder2.addFormDataPart("template_rectangle",template_rectangle);
                builder2.addFormDataPart("merge_file",file2.getName(),requestBody2);

                Request request2 = new Request.Builder()
                        .url("https://api-cn.faceplusplus.com/imagepp/v1/mergeface")
                        .post( builder2.build())
                        .build();
                try {
                    Response response=client.newCall(request2).execute();
                    responseData2=response.body().string();
                    Message message=Message.obtain();
                    message.what=2;
                    myhandler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();

到此,对json数据解析后得到了融合后饭回来的图片的base64编码字符串,再转化为bitmap就行啦

  case 2:
                    Gson gson2=new Gson();
                    MergeFace mergeFace=gson2.fromJson(responseData2,MergeFace.class);
                    String mergeImageString=mergeFace.getResult();
                    Bitmap bitmap=stringtoBitmap(mergeImageString);
                    mImageView.setImageBitmap(bitmap);
                    break;

转bitmap方法

  public Bitmap stringtoBitmap(String string){
        //将字符串转换成Bitmap类型
        Bitmap bitmap=null;
        try {
            byte[]bitmapArray;
            bitmapArray= Base64.decode(string, Base64.DEFAULT);
            bitmap= BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return bitmap;
    }

到这就可以显示啦

 

demo下载地址:https://download.csdn.net/download/jiye111/10641998

 

相关标签: Face 人脸融合