| | |
| | | |
| | | @Override |
| | | public void run() { |
| | | |
| | | try { |
| | | // 获取BDFaceCheckConfig配置信息 |
| | | if (bdFaceCheckConfig == null) { |
| | | |
| | |
| | | |
| | | @Override |
| | | public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) { |
| | | |
| | | try { |
| | | |
| | | // 人脸id赋值 |
| | | if (mLastFaceId != fastFaceInfos[0].faceID) { |
| | |
| | | if (faceDetectCallBack != null) { |
| | | faceDetectCallBack.onFaceDetectCallback(livenessModel); |
| | | } |
| | | }catch (RuntimeException e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | }catch (Exception e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | }); |
| | | }catch (RuntimeException e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | }catch (Exception e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | |
| | | } |
| | | } |
| | | return isBestImageCheck; |
| | | } |
| | | |
| | | /** |
| | | * 特征提取-人脸识别比对 |
| | | * |
| | | * @param rgbInstance 可见光底层送检对象 |
| | | * @param landmark 检测眼睛,嘴巴,鼻子,72个关键点 |
| | | * @param faceInfos nir人脸数据 |
| | | * @param nirInstance nir 图像句柄 |
| | | * @param livenessModel 检测结果数据集合 |
| | | * @param featureCheckMode 特征抽取模式【不提取特征:1】;【提取特征:2】;【提取特征+1:N检索: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); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | @Override |
| | | public void run() { |
| | | try { |
| | | onDetect( |
| | | bdFaceCheckConfig, |
| | | rgbInstance, |
| | |
| | | new DetectListener() { |
| | | @Override |
| | | public void onDetectSuccess(FaceInfo[] faceInfos, BDFaceImageInstance rgbInstance) { |
| | | try { |
| | | // 人脸id赋值 |
| | | if (mLastFaceId != fastFaceInfos[0].faceID) { |
| | | mLastFaceId = fastFaceInfos[0].faceID; |
| | |
| | | } |
| | | } |
| | | }); |
| | | }catch (RuntimeException e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | }catch (Exception e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | }); |
| | | }catch (RuntimeException e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | }catch (Exception e){ |
| | | faceDetectCallBack.onTip(1,e.getMessage()); |
| | | } |
| | | } |
| | | }); |
| | | } |