人脸识别

今天介绍的是通过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

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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值