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

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

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

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

上个效果图

安卓开发 利用Face++实现人脸融合效果_第1张图片安卓开发 利用Face++实现人脸融合效果_第2张图片

安卓开发 利用Face++实现人脸融合效果_第3张图片

步骤

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

2.导入需要的第三方库

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

安卓开发 利用Face++实现人脸融合效果_第4张图片安卓开发 利用Face++实现人脸融合效果_第5张图片

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=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

 

你可能感兴趣的:(安卓开发)