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 ++++++++++++++++++++++++++-----------------------------
1 files changed, 457 insertions(+), 509 deletions(-)
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