美文网首页
Android Arcface 2.0人脸识别注册失败问题

Android Arcface 2.0人脸识别注册失败问题

作者: 如果天空不蓝 | 来源:发表于2019-05-21 11:23 被阅读0次

    人脸识别需要init初始化(FaceServer中),离开时需要unInit销毁;当一个含有人脸识别的界面A跳向另一个含有人脸识别的界面B时,由于初始化和销毁都是对FaceServer类加锁(synchronized (this) {})的,所以导致注册时为注销失败,或注册了又被注销失败。

    FaceServer类中:
    初始化:

    public boolean init(Context context) {
            synchronized (this) {
                if (faceEngine == null && context != null) {
                    faceEngine = new FaceEngine();
                    int engineCode = faceEngine.init(context, FaceEngine.ASF_DETECT_MODE_IMAGE, FaceEngine.ASF_OP_0_HIGHER_EXT, 16, 1, FaceEngine.ASF_FACE_RECOGNITION | FaceEngine.ASF_FACE_DETECT);
                    if (engineCode == ErrorInfo.MOK) {
                        initFaceList(context);
                        return true;
                    } else {
                        faceEngine = null;
                        Log.e(TAG, "init: failed! code = " + engineCode);
                        return false;
                    }
                }
                return false;
            }
        }
    
    

    销毁:

    
    public void unInit() {
            synchronized (this) {
                if (faceRegisterInfoList != null) {
                    faceRegisterInfoList.clear();
                    faceRegisterInfoList = null;
                }
                if (faceEngine != null) {
                    faceEngine.unInit();
                    faceEngine = null;
                }
            }
        }
    

    两个人脸识别界面都是用的同一个FaceServer类,synchronized导致如果当前有其他线程正持有该类锁,那么新到的线程就必须等待,所以

    ①A跳转B后注销A(uninit),则会导致B中初始化(init)时已存在faceEngine对象,然后注销A时又会删除faceEngine对象,导致人脸注册失败

    相关文章

      网友评论

          本文标题:Android Arcface 2.0人脸识别注册失败问题

          本文链接:https://www.haomeiwen.com/subject/zdmdzqtx.html