今天介绍的是通过face++联网API实现人脸识别功能、打开相机及从相册获取图片功能。
文档请到face++官网查看(https://www.faceplusplus.com.cn/)
程序的主流程:
1、创建一个人脸的集合FaceSet,用于存储人脸标识 face_token
调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/faceset/create
RequestParams params = new RequestParams();
params.put("api_key",Constant.Key);
params.put("api_secret",Constant.Secret);
params.put("display_name","FaceSet");
params.put("outer_id","faceSet");
HttpUtil.post(Constant.createUrl,params,new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String resultJson) {
super.onSuccess(resultJson);
Log.e("createFaceSet==Success","success");
Log.e("resultJson===",resultJson.toString());
}
@Override
public void onFailure(Throwable throwable, String resultJson) {
super.onFailure(throwable, resultJson);
Log.e("createFaceSet==Error","error");
Log.e("resultJson===",resultJson.toString());
Toast.makeText(MainActivity.this,"createFaceSet=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
}
});
2、传入图片进行人脸检测和人脸分析
调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/detect
Bitmap bitmap = BitmapFactory.decodeFile(urlImg);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream );
byte[] imagebyte = outputStream.toByteArray();
String image_base64 = Constant.encode(imagebyte);
RequestParams params = new RequestParams();
params.put("api_key", Constant.Key);
params.put("api_secret",Constant.Secret);
params.put("image_base64",image_base64);
params.put("return_attributes","gender,age");
HttpUtil.post(Constant.detectUrl,params,new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String resultJson) {
super.onSuccess(resultJson);
Log.e("detect==testSuccess","success");
Log.e("resultJson===",resultJson.toString());
result.setText(resultJson.toString());
if(resultJson != null){
JSONObject object;
try {
object = new JSONObject(resultJson);
JSONArray array = object.getJSONArray("faces");
String face_token = null;
for(int i = 0;i<array.length();i++){
JSONObject oj = (JSONObject) array.get(i);
face_token = (String) oj.get("face_token");
}
if(face_token != null){
Log.e("face_token",face_token);
if (state == 1){
addFace(face_token);
}else if(state == 2){
serachFace(face_token);
}else{
Toast.makeText(MainActivity.this,"state=="+state,Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(MainActivity.this,"上传图片无法获取人脸标识",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Throwable throwable, String resultJson) {
super.onFailure(throwable, resultJson);
Log.e("detect==testError","error");
Log.e("resultJson===",resultJson.toString());
Toast.makeText(MainActivity.this,"detect=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
result.setText(resultJson.toString());
}
});
3、为一个已创建的人脸集合FaceSet 添加人脸标识face_token
调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/faceset/addface
RequestParams params = new RequestParams();
params.put("api_key",Constant.Key);
params.put("api_secret",Constant.Secret);
params.put("faceset_token",faceset_token);
params.put("face_tokens",face_token);
HttpUtil.post(Constant.addfaceUrl,params,new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String resultJson) {
super.onSuccess(resultJson);
Log.e("addFace==Success","success");
Log.e("resultJson===",resultJson.toString());
JSONObject object;
try {
object = new JSONObject(resultJson);
int face_added = Integer.parseInt(object.getString("face_added"));
if(face_added > 0){
Toast.makeText(MainActivity.this,"添加人脸标识成功!",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,"添加人脸标识失败!",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable throwable, String resultJson) {
super.onFailure(throwable, resultJson);
Log.e("addFace==Error","error");
Log.e("resultJson===",resultJson.toString());
Toast.makeText(MainActivity.this,"addFace=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
}
});
4、在一个已有的人脸集合FaceSet 中找出与目标人脸最相似的一张或多张人脸,返回置信度和不同误识率下的阈值
调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/search
RequestParams params = new RequestParams();
params.put("api_key",Constant.Key);
params.put("api_secret",Constant.Secret);
params.put("face_token",face_token);
params.put("faceset_token",faceset_token);
/**
* 控制返回比对置信度最高的结果的数量。合法值为一个范围 [1,5] 的整数。默认值为 1
*/
HttpUtil.post(Constant.searchUrl,params,new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String resultJson) {
super.onSuccess(resultJson);
Log.e("serachFace==Success","success");
Log.e("resultJson===",resultJson.toString());
JSONObject object;
try {
object = new JSONObject(resultJson);
JSONArray array = object.getJSONArray("results");
//比对结果置信度
int confidence = 0;
for(int i = 0;i<array.length();i++){
JSONObject oj = (JSONObject) array.get(i);
confidence = oj.getInt("confidence");
}
if(confidence != 0){
Log.e("confidence",confidence+"");
if(confidence >= 80){
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("比对结果");
builder.setMessage("通过");
byte[] requestData;
requestData = CommandGenerate.generateLockCmd(CommandGenerate.CMD.UNLOCK,4);
sendDataToSerial(requestData);
builder.show();
}else{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("比对结果");
builder.setMessage("未通过");
builder.show();
//Toast.makeText(MainActivity.this,"比对结果置信度低于80=="+confidence,Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(MainActivity.this,"FaceSet中未搜索到相吻合的信息",Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable throwable, String resultJson) {
super.onFailure(throwable, resultJson);
Log.e("serachFace==Error","error");
Log.e("resultJson===",resultJson.toString());
Toast.makeText(MainActivity.this,"serachFace=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
}
});
项目源码:http://download.csdn.net/download/daxudada/10229284
希望对大家有用,如有问题请多多指教。关注我哟