Android 虹软2.0人脸识别,注册失败问题 分析synchronized的作用

摘要:
人脸识别需要在离开时初始化初始化和unInit销毁;当一个包含人脸识别的接口A跳转到另一个包含面部识别的接口B时,因为初始化和销毁锁定了FaceServer类,所以注册失败或注册再次失败=null){faceEngine.unInit();faceEngine=null;}}两个人脸识别接口都使用相同的FaceServer类。同步的结果是,如果另一个线程持有这种类型的锁,则新线程必须等待。因此① A跳转到B并注销A,这将导致在初始化时B中存在faceEngine对象,然后当它注销A时,faceEngine对象将被删除,导致人脸注册失败

人脸识别需要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 虹软2.0人脸识别,注册失败问题 分析synchronized的作用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++获取当前目录设计模式—责任链模式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jvm主内存与工作内存

一、jvm主内存与工作内存     首先,JVM将内存组织为主内存和工作内存两个部分。     主内存主要包括本地方法区和堆。每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。   1.所有的变量都存储在主内存中(虚拟机内存的一部分),对于所有线程都是共...

Android 虹软免费人脸识别 SDK开发

目前我们的应用内使用了 ArcFace 的人脸检测功能,其他的我们并不了解,所以这里就和大家分享一下我们的集成过程和一些使用心得集成ArcFace FD 的集成过程非常简单在 ArcFace FD 的文档上有说明支持的系统为 5.0 及以上系统,但其实在 4.4 系统上也是可以跑的, if (engine == null) { // &&...

Android打开相机进行人脸识别,使用虹软人脸识别引擎

上一张效果图,渣画质,能看就好 功能说明: 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄、性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开启相机和人脸追踪、识别功能在FaceCameraHelper中。 实现逻辑: 打开相机,监听预览数据回调进行人脸追踪,且为每个检测到的人脸都分配一个tr...

java线程安全初窥探

知识点: 线程同步 线程并发 问题描述:在当处理全局变量的时候,当两个或者以上的线程处理同一个** 全局 **变量的时候,可能会出现冲突问题。 java 同步函数 首先看一下问题场景 package com.Thread.Test; /** * 抢票问题的一个案例分析 */ class ThreadTrain implements Runna...

opencv 人脸识别 (一)训练样本的处理

本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤: 进行人脸检测,将检测出的人脸存入数据库2 对数据库2进行人脸建模 在测试集上进行recognition 本篇实现第一步: 进行人脸检测,将检测出的人脸存入数据库2 环境:vs2010+opencv 2.4.6.0 特征:eigenface Input:一个人脸数据库,...

【Java并发基础】死锁

前言 我们使用加锁机制来保证线程安全,但是如果过度地使用加锁,则可能会导致死锁。下面将介绍关于死锁的相关知识以及我们在编写程序时如何预防死锁。 什么是死锁 学习操作系统时,给出死锁的定义为两个或两个以上的线程在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。简化一点说就是:一组相互竞争资源的线程因为互相等待,导致“永久”...