diff --git a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java index d118cf6..9c32c31 100644 --- a/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java @@ -84,7 +84,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi private static final int PERFER_HEIGH = SingleBaseConfig.getBaseConfig().getRgbAndNirHeight(); // private static final int PREFER_WIDTH = 1280; -// private static final int PERFER_HEIGH = 800; +// private static final int PERFER_HEIGH = 720; // 新增控制变量 private static int PROCESS_FRAME_INTERVAL = 3; // 快速处理频率,每隔3帧处理一次 @@ -1224,19 +1224,21 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi public void onGetCameraData(byte[] data, Camera camera, int width, int height) { try { // Log.d(TAG, "45466: 444:"+isNeedCamera); + frameCounter++; // 摄像头预览数据进行人脸检测 if (isNeedCamera) { // 增加帧计数器和时间间隔控制 - frameCounter++; +// frameCounter++; long currentTime = System.currentTimeMillis(); // 智能调节处理频率 adjustProcessFrequency(currentTime); - + Log.d(TAG, "frameCounter45466:"+(frameCounter % PROCESS_FRAME_INTERVAL == 0)+" || "+((currentTime - lastProcessTime)>MIN_PROCESS_INTERVAL)); // 只有当满足处理条件时才进行人脸检测 if (frameCounter % PROCESS_FRAME_INTERVAL == 0 && (currentTime - lastProcessTime) > MIN_PROCESS_INTERVAL) { +// if(true){ Log.d(TAG, "满足条件: 0000000:"+isNeedCamera+"|"+needSendFaceImage); lastProcessTime = currentTime; // Log.d(TAG, "onGetCameraData: 666:"+FaceSDKManager.initStatus+"帧数阈值:"+SingleBaseConfig.getBaseConfig().getFramesThreshold()); @@ -1256,14 +1258,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi @Override public void onFaceDetectCallback(LivenessModel livenessModel) { - Log.d(TAG, "onGetCameraData: 777:"+livenessModel.getTrackFaceInfo().length); + Log.d(TAG, "onGetCameraData: 777:"+livenessModel.getTrackFaceInfo().length+"|height:"+height+"| width:"+width); try { // 检查是否需要进行人脸检测 if (!isNeedCheckFace()) { LogManager.logDebug(TAG, "当前有弹窗覆盖,跳过人脸检测处理"); + layoutCompareStatus.setVisibility(View.GONE);//有弹窗时移除提示 + showFrame(null); return; } - + // 更新人脸检测状态 updateFaceDetectionStatus(livenessModel); @@ -1289,25 +1293,30 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi public void onFaceDetectDarwCallback(LivenessModel livenessModel) { try { // 绘制人脸框 - showFrame(livenessModel); + // showFrame(livenessModel); + // 绘制人脸框 + if (!mAutoCameraPreviewView.isDraw) { + showFrame(livenessModel); + } } catch (Exception e) { LogManager.logError(TAG, "人脸框绘制回调处理异常", e); } } }); - } else if (frameCounter % 30 == 0 && isApplicationInForeground()) { + } else if (frameCounter % 30 == 0 ) { Log.e(TAG, "每30帧清空一次画布: 11111:"); // 对于跳过处理的帧,每30帧清空一次画布,确保无人脸时画面干净 - try { - LivenessModel emptyModel = new LivenessModel(); - emptyModel.setTrackFaceInfo(null); - showFrame(emptyModel); - } catch (Exception e) { - LogManager.logError(TAG, "清空画布时发生异常", e); - } + // try { + // LivenessModel emptyModel = new LivenessModel(); + // emptyModel.setTrackFaceInfo(null); + // showFrame(emptyModel); + // } catch (Exception e) { + // LogManager.logError(TAG, "清空画布时发生异常", e); + // } } }else{ Log.e(TAG, "不满足条件: 0000000:"); + showFrame(null); android.util.Log.d("OXFace", "isNeedCamera: false"); } } catch (Exception e) { @@ -1374,6 +1383,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi lastFaceDetectedTime = currentTime; consecutiveNoFaceCount = 0; // 重置连续未检测到人脸计数器 + Log.e(TAG, "检测到人脸updateFaceDetectionStatus: "); LogManager.logDebug(TAG, "检测到人脸"); } else { // 未检测到人脸 @@ -1383,6 +1393,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi if (consecutiveNoFaceCount >= CONSECUTIVE_NO_FACE_THRESHOLD) { isFaceDetected = false; LogManager.logDebug(TAG, "连续未检测到人脸,当前计数: " + consecutiveNoFaceCount); + Log.e(TAG, "连续未检测到人脸:当前计数 "+consecutiveNoFaceCount); } } } @@ -1392,10 +1403,13 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi */ private void showFrame(final LivenessModel model) { runOnUiThread(new Runnable() { + @Override public void run() { +// Log.d(TAG, "showFrame888:"+model.toString()); Canvas canvas = mDrawDetectFaceView.lockCanvas(); if (canvas == null) { + mDrawDetectFaceView.unlockCanvasAndPost(canvas); return; } @@ -1404,6 +1418,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi // 如果没有模型数据,直接返回清空的画布 if (model == null) { + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); mDrawDetectFaceView.unlockCanvasAndPost(canvas); return; } @@ -1413,18 +1428,21 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi // 如果没有检测到人脸,直接返回清空的画布 if (faceInfos == null || faceInfos.length == 0) { + // 清空canvas + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); mDrawDetectFaceView.unlockCanvasAndPost(canvas); return; } + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // 只在检测到人脸时绘制人脸框 for (int i = 0; i < faceInfos.length; i++) { FaceInfo faceInfo = faceInfos[i]; // 如果人脸置信度太低,不绘制 - if (faceInfo.score < 0.6) { - continue; - } +// if (faceInfo.score < 0.7f) { +// continue; +// } rectF.set(FaceOnDrawTexturViewUtil.getFaceRectTwo(faceInfo)); // 检测图片的坐标和显示的坐标不一样,需要转换。 @@ -1444,6 +1462,8 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi rectF.bottom = screenHeight - tempTop; Log.d(TAG, "第7批设备人脸框坐标已进行180度旋转适配"); } + + // 人脸框颜色 FaceOnDrawTexturViewUtil.drawFaceColor(paint, paintBg, liveStatus, model); @@ -1838,12 +1858,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi layoutCompareStatus.setBackgroundColor(Color.parseColor("#CC000000")); if (livenessModel == null) { liveStatus = false; - layoutCompareStatus.setVisibility(View.GONE); +// layoutCompareStatus.setVisibility(View.GONE); // mFaceDetectImageView.setImageResource(R.mipmap.ic_image_video); // mTvDetect.setText(String.format("检测耗时 :%s ms", 0)); // mTvLive.setText(String.format("RGB活体检测耗时 :%s ms", 0)); // mTvLiveScore.setText(String.format("RGB活体检测结果 :%s", false)); // mTvAllTime.setText(String.format("总耗时 :%s ms", 0)); + + layoutCompareStatus.setVisibility(View.VISIBLE); + textCompareStatus.setTextColor(Color.parseColor("#fec133")); + textCompareStatus.setText("未检测到人脸"); return; } @@ -1863,14 +1887,14 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi } // 模糊结果过滤 - float blur = livenessModel.getFaceInfo().bluriness; - if (blur > SingleBaseConfig.getBaseConfig().getBlur()) { - //照片模糊 - layoutCompareStatus.setVisibility(View.VISIBLE); - textCompareStatus.setTextColor(Color.parseColor("#fec133")); - textCompareStatus.setText("人脸模糊,请摘掉眼镜帽子调整识别角度"); - return; - } +// float blur = livenessModel.getFaceInfo().bluriness; +// if (blur > SingleBaseConfig.getBaseConfig().getBlur()) { +// //照片模糊 +// layoutCompareStatus.setVisibility(View.VISIBLE); +// textCompareStatus.setTextColor(Color.parseColor("#fec133")); +// textCompareStatus.setText("人脸模糊,请移动"); +// return; +// } //质量检测 if (!livenessModel.isQualityCheck()) { @@ -3200,6 +3224,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi } catch (Exception e) { LogManager.logError(TAG, "清空画布时发生异常", e); } + + // 设置新的超时任务 + cameraTimeoutHandler = new Handler(); + cameraTimeoutHandler.postDelayed(new Runnable() { + @Override + public void run() { + LogManager.logWarning(TAG, "摄像头暂停超时,自动恢复并关闭所有对话框"); + forceResumeAndCloseAllDialogs(); + } + }, 10000); LogManager.logInfo(TAG, "摄像头已暂停,请求计数: " + pauseRequestCount + ", 超时时间: " + "ms"); } diff --git a/financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java b/financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java index 7828381..761c586 100644 --- a/financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java +++ b/financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java @@ -856,9 +856,10 @@ public class FaceSDKManager { if(deviceType == 6){ Log.e("FaceSDKManager", "switchCamera--第7批"); SingleBaseConfig.getBaseConfig().setVideoDirection(90); - SingleBaseConfig.getBaseConfig().setRgbVideoDirection(90); + SingleBaseConfig.getBaseConfig().setRgbVideoDirection(90); //视频流方向 SingleBaseConfig.getBaseConfig().setDetectDirection(270); - SingleBaseConfig.getBaseConfig().setRgbDetectDirection(270); + SingleBaseConfig.getBaseConfig().setRgbDetectDirection(270); //检测方向 + SingleBaseConfig.getBaseConfig().setFramesThreshold(10); // SingleBaseConfig.getBaseConfig().setMirrorDetectRGB(0); }else if(deviceType == 5){ Log.e("FaceSDKManager", "switchCamera--第6批"); diff --git a/financelibrary/src/main/java/com/baidu/idl/face/main/finance/model/BaseConfig.java b/financelibrary/src/main/java/com/baidu/idl/face/main/finance/model/BaseConfig.java index 1a57032..0031666 100644 --- a/financelibrary/src/main/java/com/baidu/idl/face/main/finance/model/BaseConfig.java +++ b/financelibrary/src/main/java/com/baidu/idl/face/main/finance/model/BaseConfig.java @@ -29,9 +29,9 @@ public class BaseConfig { // 默认为80px。可传入大于50px的数值,小于此大小的人脸不予检测 private int minimumFace = 80; // 人脸置信度用于表征被检测到的物体是人脸的概率,该阈值设置越高检测越严格,建议在0.3-0.8区间内调整阈值 - private float faceThreshold = 0.5f; + private float faceThreshold = 0.6f; // 模糊度设置,默认0.5。取值范围[0~1],0是最清晰,1是最模糊 - private float blur = 0.8f; + private float blur = 0.7f; // 光照设置,默认0.8.取值范围[0~1], 数值越大,光线越强 private float illum = 0.8f; // 姿态阈值 @@ -158,7 +158,7 @@ public class BaseConfig { // 6:奥比中光Deeyea(结构光) // 7:华捷艾米A100S、A200(结构光) // 8:Pico DCAM710(ToF) - private int cameraType = 0; + private int cameraType = 2; // 0:RGB无镜像,1:有镜像 private int mirrorRGB = 0; @@ -173,9 +173,9 @@ public class BaseConfig { // rgb和nir摄像头高 private int rgbAndNirHeight = 480; // depth摄像头宽 - private int depthWidth = 640; //640 + private int depthWidth = 480; //640 // depth摄像头高 - private int depthHeight = 480; //400 + private int depthHeight = 640; //400 // 是否开启最优人脸检测 private boolean usingBestImage = true;