From 542c054c6904021e067364914fbf6b3947c5039b Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期一, 15 十二月 2025 15:33:48 +0800
Subject: [PATCH] 指纹钥匙柜
---
keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java | 966 +++++++++++++++++++++++++----------------------------
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/MApplication.java | 1
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java | 42 -
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java | 6
keyCabinet-android/app/build.gradle | 2
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java | 24 -
6 files changed, 473 insertions(+), 568 deletions(-)
diff --git a/keyCabinet-android/app/build.gradle b/keyCabinet-android/app/build.gradle
index 9dfcf2e..d7e696f 100644
--- a/keyCabinet-android/app/build.gradle
+++ b/keyCabinet-android/app/build.gradle
@@ -26,7 +26,7 @@
ndk {
moduleName "facesdk"
ldLibs "log"
- abiFilters "armeabi-v7a","x86" // "armeabi", "x86", "arm64-v8a"
+ abiFilters "arm64-v8a"
}
multiDexEnabled true
}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/MApplication.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/MApplication.java
index dd5309b..9044b12 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/MApplication.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/MApplication.java
@@ -9,7 +9,6 @@
import android.widget.ImageView;
import androidx.annotation.Nullable;
-
import com.doumee.keyCabinet.bean.DevConfigBean;
import com.doumee.keyCabinet.bean.LoginBean;
import com.doumee.keyCabinet.utils.CrashHandler;
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
index 97fb266..9e908d5 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/face/FaceActivity.java
@@ -5,6 +5,7 @@
import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.Color;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Handler;
@@ -15,6 +16,7 @@
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
+import android.text.format.DateUtils;
import android.text.style.TextAppearanceSpan;
import android.view.View;
import android.view.ViewTreeObserver;
@@ -37,6 +39,7 @@
import com.doumee.keyCabinet.event.TimeClockEvent;
import com.doumee.keyCabinet.ui.keyCabinet.KeyCabinetActivity;
import com.doumee.keyCabinet.utils.BraceletLogUtils;
+import com.doumee.keyCabinet.utils.CrashHandler;
import com.doumee.keyCabinet.utils.face.FaceUtils;
import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig;
import com.doumee.keyCabinet.utils.usb.DevComm;
@@ -57,6 +60,7 @@
import com.example.datalibrary.model.LivenessModel;
import com.example.datalibrary.model.User;
import com.example.datalibrary.utils.FaceOnDrawTexturViewUtil;
+import com.example.datalibrary.utils.FileUtils;
import com.example.datalibrary.utils.ToastUtils;
import org.greenrobot.eventbus.EventBus;
@@ -64,6 +68,7 @@
import org.greenrobot.eventbus.ThreadMode;
import java.math.BigDecimal;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -572,6 +577,9 @@
@Override
public void onTip(int code, String msg) {
+ if(1==code) {
+ SpUtil.saveString(CrashHandler.FILE_NAME + StringUtil.DateToStr(new Date()), msg);
+ }
if(isToChose){
return;
}
@@ -728,46 +736,25 @@
return;
}
if (livenessModel == null) {
- if (isCompareCheck) {
- /*getDB().clFail.setVisibility(View.VISIBLE);
- getDB().tv4.setText(getString(R.string.face_tip2));
- handler.sendEmptyMessageDelayed(0,1000);*/
- }
- //System.out.println("======>浜鸿劯璇嗗埆澶辫触");
+
return;
}
if (livenessModel.isQualityCheck()) {
//鏄惁閫氳繃璐ㄩ噺妫�娴�
- if (isCompareCheck) {
- /*getDB().clFail.setVisibility(View.VISIBLE);
- getDB().tv4.setText(getString(R.string.face_tip2));
- handler.sendEmptyMessageDelayed(0,1000);*/
- }
+
} else {
User user = livenessModel.getUser();
if (user == null) {
mUser = null;
//EventBus.getDefault().post(new HttpEvent("浜鸿劯鐢ㄦ埛妫�娴嬪け璐�------->"+(status==0?"绠$悊鍛樹汉鑴告娴嬶細":"鍙告満浜鸿劯妫�娴嬶細")));
- if (isCompareCheck) {
- /*getDB().clFail.setVisibility(View.VISIBLE);
- getDB().tv4.setText(getString(R.string.face_tip2));
- handler.sendEmptyMessageDelayed(0,1000);*/
- }
-
} else {
mUser = user;
- /*EventBus.getDefault().post(new HttpEvent("浜鸿劯鐢ㄦ埛------->"+(status==0?"绠$悊鍛樹汉鑴告娴嬶細":"鍙告満浜鸿劯妫�娴嬶細")
- +(user.getGroupId().equals("0")?"绠$悊鍛�":"鍙告満")));*/
+ //EventBus.getDefault().post(new HttpEvent("浜鸿劯鐢ㄦ埛------->"+(status==0?"绠$悊鍛樹汉鑴告娴嬶細":"鍙告満浜鸿劯妫�娴嬶細")+(user.getGroupId().equals("0")?"绠$悊鍛�":"鍙告満")));
if (isCompareCheck) {
getDB().clFail.setVisibility(View.GONE);
if (handler.hasMessages(0)) {
handler.removeMessages(0);
}
- /*textHuanying.setVisibility(View.GONE);
- userNameLayout.setVisibility(View.VISIBLE);
- nameImage.setImageResource(R.mipmap.ic_tips_gate_success);
- nameText.setTextColor(Color.parseColor("#0dc6ff"));
- nameText.setText(FileUtils.spotString(user.getUserName()) + " 娆㈣繋鎮�");*/
}
isToChose = true;
//璇嗗埆鎴愬姛锛岃烦杞�
@@ -979,12 +966,7 @@
EventBus.getDefault().post(new HttpEvent("杩炴帴璁惧澶辫触3," + mDevComm.Run_GetDeviceInfo(w_strInfo)));
}
} else {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- EventBus.getDefault().post(new HttpEvent("杩炴帴璁惧澶辫触4,"+mDevComm.Run_TestConnection()));
- }
- });
+ EventBus.getDefault().post(new HttpEvent("杩炴帴璁惧澶辫触4,"+mDevComm.Run_TestConnection()));
mDevComm.CloseComm();
}
}
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java
index a95e77c..3fb5828 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ZWLRActivity.java
@@ -256,12 +256,6 @@
}
}
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void HttpEvent(HttpEvent e){
- if(!isFinishing()){
- getVM().addInfo(e.getMsg());
- }
- }
private static DevComm mDevComm;
//鏈�澶ф寚绾规暟
private int maxFpCount = 500;
diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
index 3d9d176..629717b 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -135,6 +135,7 @@
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.regex.Matcher;
@@ -229,23 +230,6 @@
getPermission();
mXService = new MyService(this);
//Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
- Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
- String time2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
- getVM().addInfo("GlobalException绾跨▼鎶ラ敊锛�" + thread.getName());
- try {
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- PrintStream print = new PrintStream(out);
- //瀵煎嚭鍙戠敓寮傚父鐨勬椂闂�
- print.println(time2);
- print.println();
- throwable.printStackTrace(print);
- SpUtil.saveString(CrashHandler.FILE_NAME+time2,new String(out.toByteArray()));
- print.close();
- } catch (Exception e) {
- e.printStackTrace();
- getVM().addInfo("閿欒鏃ュ織2"+e.getMessage());
- }
- });
}
private void initM(){
@@ -260,6 +244,7 @@
if((availableMemory<100&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
("02:00:00".equals(StringUtil.getHM()))){
//鍙敤鍐呭瓨灏忎簬400M,鎴栬�呮瘡澶╁噷鏅�2鐐癸紝閲嶅惎app
+ //ToastView.show(MApplication.mContext,"鍐呭瓨绱у紶锛岄噸鏂板惎鍔�");
restartApp();
}
}
@@ -315,7 +300,6 @@
}
lastDownTime1 = System.currentTimeMillis();
downCount1++;
- System.out.println();
//Timber.tag("==>").d(""+downCount1);
if(downCount1>4) {
downCount1=0;
@@ -342,7 +326,6 @@
}
}
});
-
getDB().imgLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v1) {
@@ -585,7 +568,6 @@
@Subscribe
public void GetFacesEvent(GetFacesEvent event){
- getVM().addInfo("鏌ヨ浜鸿劯鏁版嵁======銆�");
if(!isFinishing()&&!isUpdatingFace){
getVM().addInfo("鏌ヨ浜鸿劯鏁版嵁======銆媔sDBLoad = "+isDBLoad);
if(isDBLoad){
@@ -1385,7 +1367,7 @@
@Subscribe(threadMode = ThreadMode.MAIN)
public void HttpEvent(HttpEvent e){
- if(!isFinishing()){
+ if(!isFinishing()&&getVM()!=null){
getVM().addInfo(e.getMsg());
}
}
diff --git a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
index fe9db72..3470c05 100644
--- a/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
+++ b/keyCabinet-android/datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
@@ -565,78 +565,80 @@
@Override
public void run() {
+ try {
+ // 鑾峰彇BDFaceCheckConfig閰嶇疆淇℃伅
+ if (bdFaceCheckConfig == null) {
- // 鑾峰彇BDFaceCheckConfig閰嶇疆淇℃伅
- if (bdFaceCheckConfig == null) {
+ return;
+ }
+ onDetect(
+ bdFaceCheckConfig,
+ rgbInstance,
+ fastFaceInfos,
+ livenessModel,
+ new DetectListener() {
- return;
- }
- onDetect(
- bdFaceCheckConfig,
- rgbInstance,
- fastFaceInfos,
- livenessModel,
- new DetectListener() {
+ @Override
+ public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
- @Override
- public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+ try {
- // 浜鸿劯id璧嬪��
- if (mLastFaceId != fastFaceInfos[0].faceID) {
- mLastFaceId = fastFaceInfos[0].faceID;
- mRgbLiveList.clear();
- mNirLiveList.clear();
- }
+ // 浜鸿劯id璧嬪��
+ if (mLastFaceId != fastFaceInfos[0].faceID) {
+ mLastFaceId = fastFaceInfos[0].faceID;
+ mRgbLiveList.clear();
+ mNirLiveList.clear();
+ }
- if (bdFaceCheckConfig == null) {
+ if (bdFaceCheckConfig == null) {
- livenessModel.clearIdentifyResults();
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
+ livenessModel.clearIdentifyResults();
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ return;
+ }
- // 鏈�浼樹汉鑴告帶鍒�
- if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
- livenessModel.setQualityCheck(true);
- livenessModel.clearIdentifyResults();
+ // 鏈�浼樹汉鑴告帶鍒�
+ if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
+ livenessModel.setQualityCheck(true);
+ livenessModel.clearIdentifyResults();
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ return;
+ }
- // 璐ㄩ噺妫�娴嬫湭閫氳繃,閿�姣丅DFaceImageInstance锛岀粨鏉熷嚱鏁�
+ // 璐ㄩ噺妫�娴嬫湭閫氳繃,閿�姣丅DFaceImageInstance锛岀粨鏉熷嚱鏁�
- if (!onQualityCheck(
- faceInfos, bdFaceCheckConfig.bdQualityConfig, faceDetectCallBack)) {
- livenessModel.setQualityCheck(true);
- livenessModel.clearIdentifyResults();
+ if (!onQualityCheck(
+ faceInfos, bdFaceCheckConfig.bdQualityConfig, faceDetectCallBack)) {
+ livenessModel.setQualityCheck(true);
+ livenessModel.clearIdentifyResults();
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ return;
+ }
- livenessModel.setQualityCheck(false);
- // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
- // TODO 娲讳綋妫�娴�
- float[] rgbScores = {-1};
- BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
- boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
+ livenessModel.setQualityCheck(false);
+ // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
+ // TODO 娲讳綋妫�娴�
+ float[] rgbScores = {-1};
+ BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
+ boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
- if (isLiveCheck) {
- long startRgbTime = System.currentTimeMillis();
- rgbScores =
- silentLives(
- rgbInstance,
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
- faceInfos,
- mRgbLiveList,
- bdLiveConfig.rgbLiveScore);
+ if (isLiveCheck) {
+ long startRgbTime = System.currentTimeMillis();
+ rgbScores =
+ silentLives(
+ rgbInstance,
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+ faceInfos,
+ mRgbLiveList,
+ bdLiveConfig.rgbLiveScore);
/* if (rgbScores != null){
int size = rgbScores.length;
Log.d("Attend", "score size:" + size);
@@ -645,220 +647,230 @@
}
} */
- if (faceInfos.length == 1) {
- livenessModel.setRgbLivenessScore(rgbScores[0]);
- }
- livenessModel.setRgbLivenessScores(rgbScores);
- livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startRgbTime);
- }
-
- // TODO nir娲讳綋妫�娴�
- float nirScore = -1;
- FaceInfo[] faceInfosIr = null;
- BDFaceImageInstance nirInstance = null;
- boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
- if (isHaveNirImage) {
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
- long nirInstanceTime = System.currentTimeMillis();
- nirInstance = getBdImage(nirBDFaceImageConfig, false);
-
- livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
- livenessModel.setNirInstanceTime(System.currentTimeMillis() - nirInstanceTime);
-
- // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
- long startIrDetectTime = System.currentTimeMillis();
- BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
- bdFaceDetectListConf.usingDetect = true;
- faceInfosIr =
- faceModel
- .getFaceNirDetect()
- .detect(
- BDFaceSDKCommon.DetectType.DETECT_NIR,
- BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_NIR_ACCURATE,
- nirInstance,
- null,
- bdFaceDetectListConf);
- livenessModel.setIrLivenessDuration(
- System.currentTimeMillis() - startIrDetectTime);
- // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
- if (faceInfosIr != null && faceInfosIr.length > 0) {
- FaceInfo faceInfoIr = faceInfosIr[0];
- nirScore =
- silentLive(
- nirInstance,
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_NIR,
- faceInfoIr.landmarks,
- mNirLiveList,
- bdLiveConfig.nirLiveScore);
- livenessModel.setIrLivenessScore(nirScore);
- // LogUtils.e(TIME_TAG, "live ir time = " + livenessModel.getIrLivenessDuration());
- }
- }
-
- // TODO depth娲讳綋妫�娴�
- float depthScore = -1;
- boolean isHaveDepthImage = depthBDFaceImageConfig != null && isLiveCheck;
- if (depthBDFaceImageConfig != null) {
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
- float[] depthLandmark = new float[faceInfos[0].landmarks.length];
- BDFaceImageInstance depthInstance;
- if (bdFaceCheckConfig.cameraType == 1) {
- System.arraycopy(
- faceInfos[0].landmarks,
- 0,
- depthLandmark,
- 0,
- faceInfos[0].landmarks.length);
- for (int i = 0; i < 144; i = i + 2) {
- depthLandmark[i] -= 80;
- }
- } else {
- depthLandmark = faceInfos[0].landmarks;
- }
- depthInstance = getBdImage(depthBDFaceImageConfig, false);
- livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
- long startDepthTime = System.currentTimeMillis();
- depthScore =
- faceModel
- .getFaceLive()
- .silentLive(
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
- depthInstance,
- depthLandmark);
- livenessModel.setDepthLivenessScore(depthScore);
- livenessModel.setDepthtLivenessDuration(
- System.currentTimeMillis() - startDepthTime);
- // LogUtils.e(TIME_TAG, "live depth time = " + livenessModel.getDepthtLivenessDuration());
- depthInstance.destory();
- }
-
- boolean isRgbScoreCheck = false;
- boolean isNirScoreCheck = false;
- boolean isDepthScoreCheck = false;
- if (isLiveCheck) {
- int size = rgbScores.length;
- for (int i = 0; i < size; i++) {
- if (rgbScores[i] > bdLiveConfig.rgbLiveScore) {
- isRgbScoreCheck = true;
- }
- }
- // isRgbScoreCheck = true; // liujinhui for test
- // isRgbScoreCheck = (rgbScores[0] > bdLiveConfig.rgbLiveScore);
- isNirScoreCheck =
- (isHaveNirImage ? nirScore > bdLiveConfig.nirLiveScore : true);
- isDepthScoreCheck =
- (isHaveDepthImage ? depthScore > bdLiveConfig.depthLiveScore : true);
- }
-
- // 濡傛灉璁剧疆涓轰笉杩涜娲讳綋妫�娴�
- int liveCheckMode = livenessModel.getLiveType();
- if (liveCheckMode == 0){
- isRgbScoreCheck = true;
- }
- // TODO 鐗瑰緛鎻愬彇+浜鸿劯妫�绱�
- if (!isLiveCheck || (isRgbScoreCheck && isNirScoreCheck && isDepthScoreCheck)) {
- if (livenessModel != null) {
- livenessModel.clearIdentifyResults();
- livenessModel.setUser(null);
- }
-
- synchronized (faceModel.getFaceSearch()) {
- if (faceInfos != null) {
- int size = faceInfos.length;
-
- for (int i = 0; i < size; i++) {
- // 鐗瑰緛鎻愬彇
- // 妯$硦缁撴灉杩囨护,鎴村彛缃╂椂鍊欙紝涓嶈繘琛岃繃婊�
- if (!checkMouthMask) {
- float blur = faceInfos[i].bluriness;
- BDFaceOcclusion occlusion = faceInfos[i].occlusion;
- float leftEye = occlusion.leftEye;
- // "宸︾溂閬尅"
- float rightEye = occlusion.rightEye;
- // "鍙崇溂閬尅"
- float nose = occlusion.nose;
- // "榧诲瓙閬尅缃俊搴�"
- float mouth = occlusion.mouth;
- // "鍢村反閬尅缃俊搴�"
- float leftCheek = occlusion.leftCheek;
- // "宸﹁劯閬尅"
- float rightCheek = occlusion.rightCheek;
- // "鍙宠劯閬尅"
- float chin = occlusion.chin;
- // 鍔ㄦ�佸簳搴撻檺鍒�
- faceModel
- .getFaceSearch()
- .setNeedJoinDB(
- selectQuality(
- blur,
- leftEye,
- rightEye,
- nose,
- mouth,
- leftCheek,
- rightCheek,
- chin));
+ if (faceInfos.length == 1) {
+ livenessModel.setRgbLivenessScore(rgbScores[0]);
}
-
- if (bdLiveConfig != null){
- onFeatureChecks(
- i,
- rgbInstance,
- bdFaceCheckConfig,
- faceInfos,
- faceInfosIr,
- nirInstance,
- livenessModel,
- bdFaceCheckConfig.secondFeature,
- bdFaceCheckConfig.featureCheckMode,
- bdFaceCheckConfig.activeModel,
- rgbScores,
- bdLiveConfig.rgbLiveScore);
- } else{
- onFeatureChecks(
- i,
- rgbInstance,
- bdFaceCheckConfig,
- faceInfos,
- faceInfosIr,
- nirInstance,
- livenessModel,
- bdFaceCheckConfig.secondFeature,
- bdFaceCheckConfig.featureCheckMode,
- bdFaceCheckConfig.activeModel,
- rgbScores,
- -1);
- }
-
+ livenessModel.setRgbLivenessScores(rgbScores);
+ livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startRgbTime);
}
+
+ // TODO nir娲讳綋妫�娴�
+ float nirScore = -1;
+ FaceInfo[] faceInfosIr = null;
+ BDFaceImageInstance nirInstance = null;
+ boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
+ if (isHaveNirImage) {
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
+ long nirInstanceTime = System.currentTimeMillis();
+ nirInstance = getBdImage(nirBDFaceImageConfig, false);
+
+ livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
+ livenessModel.setNirInstanceTime(System.currentTimeMillis() - nirInstanceTime);
+
+ // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
+ long startIrDetectTime = System.currentTimeMillis();
+ BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
+ bdFaceDetectListConf.usingDetect = true;
+ faceInfosIr =
+ faceModel
+ .getFaceNirDetect()
+ .detect(
+ BDFaceSDKCommon.DetectType.DETECT_NIR,
+ BDFaceSDKCommon.AlignType.BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+ nirInstance,
+ null,
+ bdFaceDetectListConf);
+ livenessModel.setIrLivenessDuration(
+ System.currentTimeMillis() - startIrDetectTime);
+ // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
+ if (faceInfosIr != null && faceInfosIr.length > 0) {
+ FaceInfo faceInfoIr = faceInfosIr[0];
+ nirScore =
+ silentLive(
+ nirInstance,
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_NIR,
+ faceInfoIr.landmarks,
+ mNirLiveList,
+ bdLiveConfig.nirLiveScore);
+ livenessModel.setIrLivenessScore(nirScore);
+ // LogUtils.e(TIME_TAG, "live ir time = " + livenessModel.getIrLivenessDuration());
+ }
+ }
+
+ // TODO depth娲讳綋妫�娴�
+ float depthScore = -1;
+ boolean isHaveDepthImage = depthBDFaceImageConfig != null && isLiveCheck;
+ if (depthBDFaceImageConfig != null) {
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
+ float[] depthLandmark = new float[faceInfos[0].landmarks.length];
+ BDFaceImageInstance depthInstance;
+ if (bdFaceCheckConfig.cameraType == 1) {
+ System.arraycopy(
+ faceInfos[0].landmarks,
+ 0,
+ depthLandmark,
+ 0,
+ faceInfos[0].landmarks.length);
+ for (int i = 0; i < 144; i = i + 2) {
+ depthLandmark[i] -= 80;
+ }
+ } else {
+ depthLandmark = faceInfos[0].landmarks;
+ }
+ depthInstance = getBdImage(depthBDFaceImageConfig, false);
+ livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
+ long startDepthTime = System.currentTimeMillis();
+ depthScore =
+ faceModel
+ .getFaceLive()
+ .silentLive(
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
+ depthInstance,
+ depthLandmark);
+ livenessModel.setDepthLivenessScore(depthScore);
+ livenessModel.setDepthtLivenessDuration(
+ System.currentTimeMillis() - startDepthTime);
+ // LogUtils.e(TIME_TAG, "live depth time = " + livenessModel.getDepthtLivenessDuration());
+ depthInstance.destory();
+ }
+
+ boolean isRgbScoreCheck = false;
+ boolean isNirScoreCheck = false;
+ boolean isDepthScoreCheck = false;
+ if (isLiveCheck) {
+ int size = rgbScores.length;
+ for (int i = 0; i < size; i++) {
+ if (rgbScores[i] > bdLiveConfig.rgbLiveScore) {
+ isRgbScoreCheck = true;
+ }
+ }
+ // isRgbScoreCheck = true; // liujinhui for test
+ // isRgbScoreCheck = (rgbScores[0] > bdLiveConfig.rgbLiveScore);
+ isNirScoreCheck =
+ (isHaveNirImage ? nirScore > bdLiveConfig.nirLiveScore : true);
+ isDepthScoreCheck =
+ (isHaveDepthImage ? depthScore > bdLiveConfig.depthLiveScore : true);
+ }
+
+ // 濡傛灉璁剧疆涓轰笉杩涜娲讳綋妫�娴�
+ int liveCheckMode = livenessModel.getLiveType();
+ if (liveCheckMode == 0) {
+ isRgbScoreCheck = true;
+ }
+ // TODO 鐗瑰緛鎻愬彇+浜鸿劯妫�绱�
+ if (!isLiveCheck || (isRgbScoreCheck && isNirScoreCheck && isDepthScoreCheck)) {
+ if (livenessModel != null) {
+ livenessModel.clearIdentifyResults();
+ livenessModel.setUser(null);
+ }
+
+ synchronized (faceModel.getFaceSearch()) {
+ if (faceInfos != null) {
+ int size = faceInfos.length;
+
+ for (int i = 0; i < size; i++) {
+ // 鐗瑰緛鎻愬彇
+ // 妯$硦缁撴灉杩囨护,鎴村彛缃╂椂鍊欙紝涓嶈繘琛岃繃婊�
+ if (!checkMouthMask) {
+ float blur = faceInfos[i].bluriness;
+ BDFaceOcclusion occlusion = faceInfos[i].occlusion;
+ float leftEye = occlusion.leftEye;
+ // "宸︾溂閬尅"
+ float rightEye = occlusion.rightEye;
+ // "鍙崇溂閬尅"
+ float nose = occlusion.nose;
+ // "榧诲瓙閬尅缃俊搴�"
+ float mouth = occlusion.mouth;
+ // "鍢村反閬尅缃俊搴�"
+ float leftCheek = occlusion.leftCheek;
+ // "宸﹁劯閬尅"
+ float rightCheek = occlusion.rightCheek;
+ // "鍙宠劯閬尅"
+ float chin = occlusion.chin;
+ // 鍔ㄦ�佸簳搴撻檺鍒�
+ faceModel
+ .getFaceSearch()
+ .setNeedJoinDB(
+ selectQuality(
+ blur,
+ leftEye,
+ rightEye,
+ nose,
+ mouth,
+ leftCheek,
+ rightCheek,
+ chin));
+ }
+
+ if (bdLiveConfig != null) {
+ onFeatureChecks(
+ i,
+ rgbInstance,
+ bdFaceCheckConfig,
+ faceInfos,
+ faceInfosIr,
+ nirInstance,
+ livenessModel,
+ bdFaceCheckConfig.secondFeature,
+ bdFaceCheckConfig.featureCheckMode,
+ bdFaceCheckConfig.activeModel,
+ rgbScores,
+ bdLiveConfig.rgbLiveScore);
+ } else {
+ onFeatureChecks(
+ i,
+ rgbInstance,
+ bdFaceCheckConfig,
+ faceInfos,
+ faceInfosIr,
+ nirInstance,
+ livenessModel,
+ bdFaceCheckConfig.secondFeature,
+ bdFaceCheckConfig.featureCheckMode,
+ bdFaceCheckConfig.activeModel,
+ rgbScores,
+ -1);
+ }
+
+ }
+ }
+ }
+ }
+
+ // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
+ livenessModel.setAllDetectDuration(System.currentTimeMillis() - startTime);
+ // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
+ // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+
+ if (nirInstance != null) {
+ nirInstance.destory();
+ }
+ // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }catch (RuntimeException e){
+ faceDetectCallBack.onTip(1,e.getMessage());
+ }catch (Exception e){
+ faceDetectCallBack.onTip(1,e.getMessage());
}
}
- }
- // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
- livenessModel.setAllDetectDuration(System.currentTimeMillis() - startTime);
- // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
- // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ @Override
+ public void onDetectFail() {
- if (nirInstance != null) {
- nirInstance.destory();
- }
- // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- }
-
- @Override
- public void onDetectFail() {
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- }
- });
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }
+ });
+ }catch (RuntimeException e){
+ faceDetectCallBack.onTip(1,e.getMessage());
+ }catch (Exception e){
+ faceDetectCallBack.onTip(1,e.getMessage());
+ }
}
});
}
@@ -884,82 +896,6 @@
}
}
return isBestImageCheck;
- }
-
- /**
- * 鐗瑰緛鎻愬彇-浜鸿劯璇嗗埆姣斿
- *
- * @param rgbInstance 鍙鍏夊簳灞傞�佹瀵硅薄
- * @param landmark 妫�娴嬬溂鐫涳紝鍢村反锛岄蓟瀛愶紝72涓叧閿偣
- * @param faceInfos nir浜鸿劯鏁版嵁
- * @param nirInstance nir 鍥惧儚鍙ユ焺
- * @param livenessModel 妫�娴嬬粨鏋滄暟鎹泦鍚�
- * @param featureCheckMode 鐗瑰緛鎶藉彇妯″紡銆愪笉鎻愬彇鐗瑰緛锛�1銆戯紱銆愭彁鍙栫壒寰侊細2銆戯紱銆愭彁鍙栫壒寰�+1锛歂妫�绱細3銆戯紱
- * @param featureType 鐗瑰緛鎶藉彇妯℃�佹墽琛� 銆愮敓娲荤収锛�1銆戯紱銆愯瘉浠剁収锛�2銆戯紱銆愭贩鍚堟ā鎬侊細3銆戯紱
- */
- private void onFeatureCheck(
- BDFaceImageInstance rgbInstance,
- BDFaceCheckConfig bdFaceCheckConfig,
- float[] landmark,
- FaceInfo[] faceInfos,
- BDFaceImageInstance nirInstance,
- LivenessModel livenessModel,
- byte[] secondFeature,
- final int featureCheckMode,
- final int featureType) {
- // 濡傛灉涓嶆娊鍙栫壒寰侊紝鐩存帴杩斿洖
- if (featureCheckMode == 1) {
- return;
- }
- byte[] feature = new byte[512];
- if (featureType == 3) {
- // todo: 娣峰悎妯℃�佷娇鐢ㄦ柟寮忔槸鏍规嵁鍥剧墖鐨勬洕鍏夋潵閫夋嫨闇�瑕佷娇鐢ㄧ殑type锛屽厜鐓х殑鍙栧�艰寖鍥翠负锛�0~1涔嬮棿
- AtomicInteger atomicInteger = new AtomicInteger();
- FaceSDKManager.getInstance().getImageIllum().imageIllum(rgbInstance, atomicInteger);
- int illumScore = atomicInteger.get();
- BDQualityConfig bdQualityConfig = bdFaceCheckConfig.bdQualityConfig;
- boolean isIllum = bdQualityConfig != null ? illumScore < bdQualityConfig.illum : false;
- BDFaceSDKCommon.FeatureType type =
- isIllum
- ? BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_NIR
- : BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO;
- BDFaceImageInstance bdFaceImageInstance = isIllum ? nirInstance : rgbInstance;
- float[] landmarks = isIllum ? faceInfos[0].landmarks : landmark;
-
- long startFeatureTime = System.currentTimeMillis();
- float featureSize = faceModel.getFaceFeature().feature(type, bdFaceImageInstance, landmarks, feature);
- livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
- livenessModel.setFeature(feature);
- // 浜鸿劯妫�绱�
- featureSearch(
- featureCheckMode,
- livenessModel,
- bdFaceCheckConfig,
- feature,
- secondFeature,
- featureSize,
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
- } else {
- // 鐢熸椿鐓ф绱�
- long startFeatureTime = System.currentTimeMillis();
- float featureSize =
- faceModel
- .getFaceFeature()
- .feature(
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO, rgbInstance, landmark, feature);
- livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
- livenessModel.setFeature(feature);
- livenessModel.setFeatureDuration(System.currentTimeMillis() - startFeatureTime);
- // 浜鸿劯妫�绱�
- featureSearch(
- featureCheckMode,
- livenessModel,
- bdFaceCheckConfig,
- feature,
- secondFeature,
- featureSize,
- BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
- }
}
/**
@@ -1384,183 +1320,195 @@
@Override
public void run() {
- onDetect(
- bdFaceCheckConfig,
- rgbInstance,
- fastFaceInfos,
- livenessModel,
- new DetectListener() {
- @Override
- public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
- // 浜鸿劯id璧嬪��
- if (mLastFaceId != fastFaceInfos[0].faceID) {
- mLastFaceId = fastFaceInfos[0].faceID;
- mRgbLiveList.clear();
- mNirLiveList.clear();
- }
- if (bdFaceCheckConfig == null) {
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
- // 鏈�浼樹汉鑴告帶鍒�
- if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
- livenessModel.setQualityCheck(true);
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- return;
- }
- onQualityCheck(
- faceInfos,
- bdFaceCheckConfig.bdQualityConfig,
- faceDetectCallBack,
- new QualityListener() {
- @Override
- public void onQualitySuccess() {
- livenessModel.setQualityCheck(false);
- // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
- // TODO 娲讳綋妫�娴�
- BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
- boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
- if (isLiveCheck) {
- long startRgbTime = System.currentTimeMillis();
- boolean rgbLiveStatus =
- faceModel
- .getFaceLive()
- .strategySilentLive(
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
- rgbInstance,
- faceInfos[0],
- bdLiveConfig.framesThreshold,
- bdLiveConfig.rgbLiveScore);
- livenessModel.setRGBLiveStatus(rgbLiveStatus);
- livenessModel.setRgbLivenessDuration(
- System.currentTimeMillis() - startRgbTime);
+ try {
+ onDetect(
+ bdFaceCheckConfig,
+ rgbInstance,
+ fastFaceInfos,
+ livenessModel,
+ new DetectListener() {
+ @Override
+ public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) {
+ try {
+ // 浜鸿劯id璧嬪��
+ if (mLastFaceId != fastFaceInfos[0].faceID) {
+ mLastFaceId = fastFaceInfos[0].faceID;
+ mRgbLiveList.clear();
+ mNirLiveList.clear();
}
- // TODO nir娲讳綋妫�娴�
- BDFaceImageInstance nirInstance = null;
- boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
- if (isHaveNirImage) {
+ if (bdFaceCheckConfig == null) {
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
- nirInstance = getBdImage(nirBDFaceImageConfig, false);
- livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
-
- // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
- long startIrDetectTime = System.currentTimeMillis();
- BDFaceDetectListConf bdFaceDetectListConf =
- new BDFaceDetectListConf();
- bdFaceDetectListConf.usingDetect = true;
- FaceInfo[] faceInfosIr =
- faceModel
- .getFaceNirDetect()
- .detect(
- BDFaceSDKCommon.DetectType.DETECT_NIR,
- BDFaceSDKCommon.AlignType
- .BDFACE_ALIGN_TYPE_NIR_ACCURATE,
- nirInstance,
- null,
- bdFaceDetectListConf);
- bdFaceDetectListConf.usingDetect = false;
- livenessModel.setIrLivenessDuration(
- System.currentTimeMillis() - startIrDetectTime);
- // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
-
- if (faceInfosIr != null && faceInfosIr.length > 0) {
- FaceInfo faceInfoIr = faceInfosIr[0];
- long startNirTime = System.currentTimeMillis();
- boolean nirLiveStatus =
- faceModel
- .getFaceLive()
- .strategySilentLive(
- BDFaceSDKCommon.LiveType
- .BDFACE_SILENT_LIVE_TYPE_NIR,
- nirInstance,
- faceInfoIr,
- bdLiveConfig.framesThreshold,
- bdLiveConfig.nirLiveScore);
- livenessModel.setNIRLiveStatus(nirLiveStatus);
- livenessModel.setIrLivenessDuration(
- System.currentTimeMillis() - startNirTime);
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
-
- nirInstance.destory();
+ return;
}
- // TODO depth娲讳綋妫�娴�
- if (depthBDFaceImageConfig != null) {
- fastFaceInfos[0].landmarks = faceInfos[0].landmarks;
- // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
- float[] depthLandmark = new float[faceInfos[0].landmarks.length];
- BDFaceImageInstance depthInstance;
- if (bdFaceCheckConfig.cameraType == 1) {
- System.arraycopy(
- faceInfos[0].landmarks,
- 0,
- depthLandmark,
- 0,
- faceInfos[0].landmarks.length);
- for (int i = 0; i < 144; i = i + 2) {
- depthLandmark[i] -= 80;
- }
- fastFaceInfos[0].landmarks = depthLandmark;
+ // 鏈�浼樹汉鑴告帶鍒�
+ if (!onBestImageCheck(livenessModel, bdFaceCheckConfig, faceDetectCallBack)) {
+ livenessModel.setQualityCheck(true);
+
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
-
- depthInstance = getBdImage(depthBDFaceImageConfig, false);
- livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
- // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
- long startDepthTime = System.currentTimeMillis();
- boolean depthLiveStatus =
- faceModel
- .getFaceLive()
- .strategySilentLive(
- BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
- depthInstance,
- fastFaceInfos[0],
- bdLiveConfig.framesThreshold,
- bdLiveConfig.nirLiveScore);
- livenessModel.setDepthLiveStatus(depthLiveStatus);
- livenessModel.setDepthtLivenessDuration(
- System.currentTimeMillis() - startDepthTime);
- depthInstance.destory();
+ return;
}
- // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
- livenessModel.setAllDetectDuration(
- System.currentTimeMillis() - startTime);
- // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
- // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+ onQualityCheck(
+ faceInfos,
+ bdFaceCheckConfig.bdQualityConfig,
+ faceDetectCallBack,
+ new QualityListener() {
+ @Override
+ public void onQualitySuccess() {
+ livenessModel.setQualityCheck(false);
+ // 鑾峰彇LivenessConfig liveCheckMode 閰嶇疆閫夐」锛氥�愪笉浣跨敤娲讳綋锛�0銆戯紱銆怰GB娲讳綋锛�1銆戯紱銆怰GB+NIR娲讳綋锛�2銆戯紱銆怰GB+Depth娲讳綋锛�3銆戯紱銆怰GB+NIR+Depth娲讳綋锛�4銆�
+ // TODO 娲讳綋妫�娴�
+ BDLiveConfig bdLiveConfig = bdFaceCheckConfig.bdLiveConfig;
+ boolean isLiveCheck = bdFaceCheckConfig.bdLiveConfig != null;
+ if (isLiveCheck) {
+ long startRgbTime = System.currentTimeMillis();
+ boolean rgbLiveStatus =
+ faceModel
+ .getFaceLive()
+ .strategySilentLive(
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+ rgbInstance,
+ faceInfos[0],
+ bdLiveConfig.framesThreshold,
+ bdLiveConfig.rgbLiveScore);
+ livenessModel.setRGBLiveStatus(rgbLiveStatus);
+ livenessModel.setRgbLivenessDuration(
+ System.currentTimeMillis() - startRgbTime);
+ }
+ // TODO nir娲讳綋妫�娴�
+ BDFaceImageInstance nirInstance = null;
+ boolean isHaveNirImage = nirBDFaceImageConfig != null && isLiveCheck;
+ if (isHaveNirImage) {
- // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁YUV-IR锛岃浆涓虹畻娉曟娴嬬殑鍥剧墖BGR
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝鎵嬫満鍜屽紑鍙戠増闇�瑕佸姩鎬侀�傞厤
+ nirInstance = getBdImage(nirBDFaceImageConfig, false);
+ livenessModel.setBdNirFaceImageInstance(nirInstance.getImage());
+
+ // 閬垮厤RGB妫�娴嬪叧閿偣鍦↖R瀵归綈娲讳綋绋冲畾锛屽鍔犵孩澶栨娴�
+ long startIrDetectTime = System.currentTimeMillis();
+ BDFaceDetectListConf bdFaceDetectListConf =
+ new BDFaceDetectListConf();
+ bdFaceDetectListConf.usingDetect = true;
+ FaceInfo[] faceInfosIr =
+ faceModel
+ .getFaceNirDetect()
+ .detect(
+ BDFaceSDKCommon.DetectType.DETECT_NIR,
+ BDFaceSDKCommon.AlignType
+ .BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+ nirInstance,
+ null,
+ bdFaceDetectListConf);
+ bdFaceDetectListConf.usingDetect = false;
+ livenessModel.setIrLivenessDuration(
+ System.currentTimeMillis() - startIrDetectTime);
+ // LogUtils.e(TIME_TAG, "detect ir time = " + livenessModel.getIrLivenessDuration());
+
+ if (faceInfosIr != null && faceInfosIr.length > 0) {
+ FaceInfo faceInfoIr = faceInfosIr[0];
+ long startNirTime = System.currentTimeMillis();
+ boolean nirLiveStatus =
+ faceModel
+ .getFaceLive()
+ .strategySilentLive(
+ BDFaceSDKCommon.LiveType
+ .BDFACE_SILENT_LIVE_TYPE_NIR,
+ nirInstance,
+ faceInfoIr,
+ bdLiveConfig.framesThreshold,
+ bdLiveConfig.nirLiveScore);
+ livenessModel.setNIRLiveStatus(nirLiveStatus);
+ livenessModel.setIrLivenessDuration(
+ System.currentTimeMillis() - startNirTime);
+ }
+
+ nirInstance.destory();
+ }
+ // TODO depth娲讳綋妫�娴�
+ if (depthBDFaceImageConfig != null) {
+ fastFaceInfos[0].landmarks = faceInfos[0].landmarks;
+ // TODO: 鐢ㄦ埛璋冩暣鏃嬭浆瑙掑害鍜屾槸鍚﹂暅鍍忥紝閫傞厤Atlas 闀滃ご锛岀洰鍓嶅鍜岄珮400*640锛屽叾浠栨憚鍍忓ご闇�瑕佸姩鎬佽皟鏁�,浜鸿劯72 涓叧閿偣x 鍧愭爣鍚戝乏绉诲姩80涓儚绱犵偣
+ float[] depthLandmark = new float[faceInfos[0].landmarks.length];
+ BDFaceImageInstance depthInstance;
+ if (bdFaceCheckConfig.cameraType == 1) {
+ System.arraycopy(
+ faceInfos[0].landmarks,
+ 0,
+ depthLandmark,
+ 0,
+ faceInfos[0].landmarks.length);
+ for (int i = 0; i < 144; i = i + 2) {
+ depthLandmark[i] -= 80;
+ }
+ fastFaceInfos[0].landmarks = depthLandmark;
+ }
+
+ depthInstance = getBdImage(depthBDFaceImageConfig, false);
+ livenessModel.setBdDepthFaceImageInstance(depthInstance.getImage());
+ // 鍒涘缓妫�娴嬪璞★紝濡傛灉鍘熷鏁版嵁Depth
+ long startDepthTime = System.currentTimeMillis();
+ boolean depthLiveStatus =
+ faceModel
+ .getFaceLive()
+ .strategySilentLive(
+ BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_DEPTH,
+ depthInstance,
+ fastFaceInfos[0],
+ bdLiveConfig.framesThreshold,
+ bdLiveConfig.nirLiveScore);
+ livenessModel.setDepthLiveStatus(depthLiveStatus);
+ livenessModel.setDepthtLivenessDuration(
+ System.currentTimeMillis() - startDepthTime);
+ depthInstance.destory();
+ }
+ // 娴佺▼缁撴潫,璁板綍鏈�缁堟椂闂�
+ livenessModel.setAllDetectDuration(
+ System.currentTimeMillis() - startTime);
+ // LogUtils.e(TIME_TAG, "all process time = " + livenessModel.getAllDetectDuration());
+ // 娴佺▼缁撴潫閿�姣佸浘鐗囷紝寮�濮嬩笅涓�甯у浘鐗囨娴嬶紝鍚︾潃鍐呭瓨娉勯湶
+
+ // 鏄剧ず鏈�缁堢粨鏋滄彁绀�
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }
+
+ @Override
+ public void onQualityFail(String detectFail, String occlusionFail) {
+ livenessModel.setQualityOcclusion(occlusionFail);
+ livenessModel.setQualityDetect(detectFail);
+ livenessModel.setQualityCheck(true);
+
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
+ }
+ }
+ });
+ }catch (RuntimeException e){
+ faceDetectCallBack.onTip(1,e.getMessage());
+ }catch (Exception e){
+ faceDetectCallBack.onTip(1,e.getMessage());
}
+ }
- @Override
- public void onQualityFail(String detectFail, String occlusionFail) {
- livenessModel.setQualityOcclusion(occlusionFail);
- livenessModel.setQualityDetect(detectFail);
- livenessModel.setQualityCheck(true);
+ @Override
+ public void onDetectFail() {
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
+ if (faceDetectCallBack != null) {
+ faceDetectCallBack.onFaceDetectCallback(livenessModel);
}
- });
- }
-
- @Override
- public void onDetectFail() {
-
- if (faceDetectCallBack != null) {
- faceDetectCallBack.onFaceDetectCallback(livenessModel);
- }
- }
- });
+ }
+ });
+ }catch (RuntimeException e){
+ faceDetectCallBack.onTip(1,e.getMessage());
+ }catch (Exception e){
+ faceDetectCallBack.onTip(1,e.getMessage());
+ }
}
});
}
--
Gitblit v1.9.3