安卓开发 利用Face++实现人脸融合效果
程序员文章站
2022-04-16 13:32:18
...
由于最近有个需求,需要人脸融合,如是上网查了以下,发现Face++用的人挺多的,但是移动端的实现的blog都是直接复制他给的demo,还是挺繁琐的,于是自己看着api就写了一个小例子,希望让后面用的人方便一点。
本demo中用的第三方控件有OKHttp,Gson,EasyPermissions
而且人脸融合需要的两个api目前是免费的
上个效果图
步骤
1.先去Face++官网注册一个开发者账户,得到自己的key和Secret
2.导入需要的第三方库
3.查看了解到自己需要的api有
和
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
上一篇: 小样儿老子没结婚
下一篇: 腾讯AI 人脸融合接口