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

人脸识别

程序员文章站 2022-05-13 21:40:23
今天介绍的是通过face++联网API实现人脸识别功能、打开相机及从相册获取图片功能。 文档请到face++官网查看(https://www.faceplusplus.com.cn/) 程序的主流程: 1、创建一个人脸的集合FaceSet,用于存储人脸标识 face_token 调用face++的u ......

今天介绍的是通过face++联网API实现人脸识别功能、打开相机及从相册获取图片功能。

文档请到face++官网查看(https://www.faceplusplus.com.cn/)

程序的主流程:

1、创建一个人脸的集合FaceSet,用于存储人脸标识 face_token

调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/faceset/create

 1 RequestParams params = new RequestParams();
 2 params.put("api_key",Constant.Key);
 3 params.put("api_secret",Constant.Secret);
 4 params.put("display_name","FaceSet");
 5 params.put("outer_id","faceSet");
 6 
 7 HttpUtil.post(Constant.createUrl,params,new AsyncHttpResponseHandler(){
 8     @Override
 9     public void onSuccess(String resultJson) {
10         super.onSuccess(resultJson);
11         Log.e("createFaceSet==Success","success");
12         Log.e("resultJson===",resultJson.toString());
13     }
14 
15     @Override
16     public void onFailure(Throwable throwable, String resultJson) {
17         super.onFailure(throwable, resultJson);
18         Log.e("createFaceSet==Error","error");
19         Log.e("resultJson===",resultJson.toString());
20         Toast.makeText(MainActivity.this,"createFaceSet=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
21     }
22 });

2、传入图片进行人脸检测和人脸分析

调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/detect

 1 Bitmap bitmap = BitmapFactory.decodeFile(urlImg);
 2 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 3 bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream );
 4 byte[] imagebyte = outputStream.toByteArray();
 5 String image_base64 = Constant.encode(imagebyte);
 6 RequestParams params = new RequestParams();
 7 params.put("api_key", Constant.Key);
 8 params.put("api_secret",Constant.Secret);
 9 params.put("image_base64",image_base64);
10 params.put("return_attributes","gender,age");
11 
12 HttpUtil.post(Constant.detectUrl,params,new AsyncHttpResponseHandler(){
13     @Override
14     public void onSuccess(String resultJson) {
15         super.onSuccess(resultJson);
16         Log.e("detect==testSuccess","success");
17         Log.e("resultJson===",resultJson.toString());
18         result.setText(resultJson.toString());
19         if(resultJson != null){
20                 JSONObject object;
21                 try {
22                     object = new JSONObject(resultJson);
23                     JSONArray array = object.getJSONArray("faces");
24                     String face_token = null;
25                     for(int i = 0;i<array.length();i++){
26                         JSONObject oj = (JSONObject) array.get(i);
27                         face_token = (String) oj.get("face_token");
28                     }
29                     if(face_token != null){
30                         Log.e("face_token",face_token);
31                         if (state == 1){
32                             addFace(face_token);
33                         }else if(state == 2){
34                             serachFace(face_token);
35                         }else{
36                             Toast.makeText(MainActivity.this,"state=="+state,Toast.LENGTH_SHORT).show();
37                         }
38                     }else{
39                         Toast.makeText(MainActivity.this,"上传图片无法获取人脸标识",Toast.LENGTH_SHORT).show();
40                     }
41                 } catch (JSONException e) {
42                     e.printStackTrace();
43                 }
44             }
45 
46         }
47 
48         @Override
49         public void onFailure(Throwable throwable, String resultJson) {
50             super.onFailure(throwable, resultJson);
51             Log.e("detect==testError","error");
52             Log.e("resultJson===",resultJson.toString());
53             Toast.makeText(MainActivity.this,"detect=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
54             result.setText(resultJson.toString());
55         }
56     });

3、为一个已创建的人脸集合FaceSet 添加人脸标识face_token

调用face++的url: https://api-cn.faceplusplus.com/facepp/v3/faceset/addface

 1 RequestParams params = new RequestParams();
 2 params.put("api_key",Constant.Key);
 3 params.put("api_secret",Constant.Secret);
 4 params.put("faceset_token",faceset_token);
 5 params.put("face_tokens",face_token);
 6 
 7 HttpUtil.post(Constant.addfaceUrl,params,new AsyncHttpResponseHandler(){
 8     @Override
 9     public void onSuccess(String resultJson) {
10         super.onSuccess(resultJson);
11         Log.e("addFace==Success","success");
12         Log.e("resultJson===",resultJson.toString());
13         JSONObject object;
14         try {
15             object = new JSONObject(resultJson);
16             int face_added = Integer.parseInt(object.getString("face_added"));
17             if(face_added > 0){
18                 Toast.makeText(MainActivity.this,"添加人脸标识成功!",Toast.LENGTH_SHORT).show();
19             }else{
20                 Toast.makeText(MainActivity.this,"添加人脸标识失败!",Toast.LENGTH_SHORT).show();
21             }
22         } catch (JSONException e) {
23             e.printStackTrace();
24         }
25     }
26 
27     @Override
28     public void onFailure(Throwable throwable, String resultJson) {
29         super.onFailure(throwable, resultJson);
30         Log.e("addFace==Error","error");
31         Log.e("resultJson===",resultJson.toString());
32         Toast.makeText(MainActivity.this,"addFace=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
33     }
34 });

4、在一个已有的人脸集合FaceSet 中找出与目标人脸最相似的一张或多张人脸,返回置信度和不同误识率下的阈值

调用face++的url:https://api-cn.faceplusplus.com/facepp/v3/search

 1 RequestParams params = new RequestParams();
 2 params.put("api_key",Constant.Key);
 3 params.put("api_secret",Constant.Secret);
 4 params.put("face_token",face_token);
 5 params.put("faceset_token",faceset_token);
 6 /**
 7  * 控制返回比对置信度最高的结果的数量。合法值为一个范围 [1,5] 的整数。默认值为 1
 8  */
 9 
10 HttpUtil.post(Constant.searchUrl,params,new AsyncHttpResponseHandler(){
11     @Override
12     public void onSuccess(String resultJson) {
13         super.onSuccess(resultJson);
14         Log.e("serachFace==Success","success");
15         Log.e("resultJson===",resultJson.toString());
16         JSONObject object;
17         try {
18             object = new JSONObject(resultJson);
19             JSONArray array = object.getJSONArray("results");
20             //比对结果置信度
21             int confidence = 0;
22             for(int i = 0;i<array.length();i++){
23                 JSONObject oj = (JSONObject) array.get(i);
24                 confidence = oj.getInt("confidence");
25             }
26             if(confidence != 0){
27                 Log.e("confidence",confidence+"");
28                 if(confidence >= 80){
29                     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
30                     builder.setTitle("比对结果");
31                     builder.setMessage("通过");
32                     byte[] requestData;
33                     requestData = CommandGenerate.generateLockCmd(CommandGenerate.CMD.UNLOCK,4);
34                     sendDataToSerial(requestData);
35                     builder.show();
36                 }else{
37                     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
38                     builder.setTitle("比对结果");
39                     builder.setMessage("未通过");
40                     builder.show();
41                     //Toast.makeText(MainActivity.this,"比对结果置信度低于80=="+confidence,Toast.LENGTH_SHORT).show();
42                 }
43             }else {
44                 Toast.makeText(MainActivity.this,"FaceSet中未搜索到相吻合的信息",Toast.LENGTH_SHORT).show();
45             }
46         } catch (JSONException e) {
47             e.printStackTrace();
48         }
49     }
50     @Override
51     public void onFailure(Throwable throwable, String resultJson) {
52         super.onFailure(throwable, resultJson);
53         Log.e("serachFace==Error","error");
54         Log.e("resultJson===",resultJson.toString());
55         Toast.makeText(MainActivity.this,"serachFace=="+resultJson.toString(),Toast.LENGTH_SHORT).show();
56     }
57 });

项目源码:http://download.csdn.net/download/daxudada/10229284

希望对大家有用,如有问题请多多指教。关注我哟