Browse Source

fix 1.2 for test

dev
MTing 3 weeks ago
parent
commit
79284bec15
  1. 82
      app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
  2. 5
      financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java
  3. 10
      financelibrary/src/main/java/com/baidu/idl/face/main/finance/model/BaseConfig.java

82
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 PERFER_HEIGH = SingleBaseConfig.getBaseConfig().getRgbAndNirHeight();
// private static final int PREFER_WIDTH = 1280; // 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帧处理一次 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) { public void onGetCameraData(byte[] data, Camera camera, int width, int height) {
try { try {
// Log.d(TAG, "45466: 444:"+isNeedCamera); // Log.d(TAG, "45466: 444:"+isNeedCamera);
frameCounter++;
// 摄像头预览数据进行人脸检测 // 摄像头预览数据进行人脸检测
if (isNeedCamera) { if (isNeedCamera) {
// 增加帧计数器和时间间隔控制 // 增加帧计数器和时间间隔控制
frameCounter++;
// frameCounter++;
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
// 智能调节处理频率 // 智能调节处理频率
adjustProcessFrequency(currentTime); adjustProcessFrequency(currentTime);
Log.d(TAG, "frameCounter45466:"+(frameCounter % PROCESS_FRAME_INTERVAL == 0)+" || "+((currentTime - lastProcessTime)>MIN_PROCESS_INTERVAL));
// 只有当满足处理条件时才进行人脸检测 // 只有当满足处理条件时才进行人脸检测
if (frameCounter % PROCESS_FRAME_INTERVAL == 0 && if (frameCounter % PROCESS_FRAME_INTERVAL == 0 &&
(currentTime - lastProcessTime) > MIN_PROCESS_INTERVAL) { (currentTime - lastProcessTime) > MIN_PROCESS_INTERVAL) {
// if(true){
Log.d(TAG, "满足条件: 0000000:"+isNeedCamera+"|"+needSendFaceImage); Log.d(TAG, "满足条件: 0000000:"+isNeedCamera+"|"+needSendFaceImage);
lastProcessTime = currentTime; lastProcessTime = currentTime;
// Log.d(TAG, "onGetCameraData: 666:"+FaceSDKManager.initStatus+"帧数阈值:"+SingleBaseConfig.getBaseConfig().getFramesThreshold()); // Log.d(TAG, "onGetCameraData: 666:"+FaceSDKManager.initStatus+"帧数阈值:"+SingleBaseConfig.getBaseConfig().getFramesThreshold());
@ -1256,11 +1258,13 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
@Override @Override
public void onFaceDetectCallback(LivenessModel livenessModel) { 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 { try {
// 检查是否需要进行人脸检测 // 检查是否需要进行人脸检测
if (!isNeedCheckFace()) { if (!isNeedCheckFace()) {
LogManager.logDebug(TAG, "当前有弹窗覆盖,跳过人脸检测处理"); LogManager.logDebug(TAG, "当前有弹窗覆盖,跳过人脸检测处理");
layoutCompareStatus.setVisibility(View.GONE);//有弹窗时移除提示
showFrame(null);
return; return;
} }
@ -1289,25 +1293,30 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
public void onFaceDetectDarwCallback(LivenessModel livenessModel) { public void onFaceDetectDarwCallback(LivenessModel livenessModel) {
try { try {
// 绘制人脸框 // 绘制人脸框
// showFrame(livenessModel);
// 绘制人脸框
if (!mAutoCameraPreviewView.isDraw) {
showFrame(livenessModel); showFrame(livenessModel);
}
} catch (Exception e) { } catch (Exception e) {
LogManager.logError(TAG, "人脸框绘制回调处理异常", e); LogManager.logError(TAG, "人脸框绘制回调处理异常", e);
} }
} }
}); });
} else if (frameCounter % 30 == 0 && isApplicationInForeground()) {
} else if (frameCounter % 30 == 0 ) {
Log.e(TAG, "每30帧清空一次画布: 11111:"); Log.e(TAG, "每30帧清空一次画布: 11111:");
// 对于跳过处理的帧每30帧清空一次画布确保无人脸时画面干净 // 对于跳过处理的帧每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{ }else{
Log.e(TAG, "不满足条件: 0000000:"); Log.e(TAG, "不满足条件: 0000000:");
showFrame(null);
android.util.Log.d("OXFace", "isNeedCamera: false"); android.util.Log.d("OXFace", "isNeedCamera: false");
} }
} catch (Exception e) { } catch (Exception e) {
@ -1374,6 +1383,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
lastFaceDetectedTime = currentTime; lastFaceDetectedTime = currentTime;
consecutiveNoFaceCount = 0; // 重置连续未检测到人脸计数器 consecutiveNoFaceCount = 0; // 重置连续未检测到人脸计数器
Log.e(TAG, "检测到人脸updateFaceDetectionStatus: ");
LogManager.logDebug(TAG, "检测到人脸"); LogManager.logDebug(TAG, "检测到人脸");
} else { } else {
// 未检测到人脸 // 未检测到人脸
@ -1383,6 +1393,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
if (consecutiveNoFaceCount >= CONSECUTIVE_NO_FACE_THRESHOLD) { if (consecutiveNoFaceCount >= CONSECUTIVE_NO_FACE_THRESHOLD) {
isFaceDetected = false; isFaceDetected = false;
LogManager.logDebug(TAG, "连续未检测到人脸,当前计数: " + consecutiveNoFaceCount); 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) { private void showFrame(final LivenessModel model) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
// Log.d(TAG, "showFrame888:"+model.toString());
Canvas canvas = mDrawDetectFaceView.lockCanvas(); Canvas canvas = mDrawDetectFaceView.lockCanvas();
if (canvas == null) { if (canvas == null) {
mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return; return;
} }
@ -1404,6 +1418,7 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
// 如果没有模型数据直接返回清空的画布 // 如果没有模型数据直接返回清空的画布
if (model == null) { if (model == null) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
mDrawDetectFaceView.unlockCanvasAndPost(canvas); mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return; return;
} }
@ -1413,18 +1428,21 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
// 如果没有检测到人脸直接返回清空的画布 // 如果没有检测到人脸直接返回清空的画布
if (faceInfos == null || faceInfos.length == 0) { if (faceInfos == null || faceInfos.length == 0) {
// 清空canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
mDrawDetectFaceView.unlockCanvasAndPost(canvas); mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return; return;
} }
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
// 只在检测到人脸时绘制人脸框 // 只在检测到人脸时绘制人脸框
for (int i = 0; i < faceInfos.length; i++) { for (int i = 0; i < faceInfos.length; i++) {
FaceInfo faceInfo = faceInfos[i]; FaceInfo faceInfo = faceInfos[i];
// 如果人脸置信度太低不绘制 // 如果人脸置信度太低不绘制
if (faceInfo.score < 0.6) {
continue;
}
// if (faceInfo.score < 0.7f) {
// continue;
// }
rectF.set(FaceOnDrawTexturViewUtil.getFaceRectTwo(faceInfo)); rectF.set(FaceOnDrawTexturViewUtil.getFaceRectTwo(faceInfo));
// 检测图片的坐标和显示的坐标不一样需要转换 // 检测图片的坐标和显示的坐标不一样需要转换
@ -1445,6 +1463,8 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
Log.d(TAG, "第7批设备人脸框坐标已进行180度旋转适配"); Log.d(TAG, "第7批设备人脸框坐标已进行180度旋转适配");
} }
// 人脸框颜色 // 人脸框颜色
FaceOnDrawTexturViewUtil.drawFaceColor(paint, paintBg, liveStatus, model); FaceOnDrawTexturViewUtil.drawFaceColor(paint, paintBg, liveStatus, model);
// 绘制人脸框 // 绘制人脸框
@ -1838,12 +1858,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
layoutCompareStatus.setBackgroundColor(Color.parseColor("#CC000000")); layoutCompareStatus.setBackgroundColor(Color.parseColor("#CC000000"));
if (livenessModel == null) { if (livenessModel == null) {
liveStatus = false; liveStatus = false;
layoutCompareStatus.setVisibility(View.GONE);
// layoutCompareStatus.setVisibility(View.GONE);
// mFaceDetectImageView.setImageResource(R.mipmap.ic_image_video); // mFaceDetectImageView.setImageResource(R.mipmap.ic_image_video);
// mTvDetect.setText(String.format("检测耗时 :%s ms", 0)); // mTvDetect.setText(String.format("检测耗时 :%s ms", 0));
// mTvLive.setText(String.format("RGB活体检测耗时 :%s ms", 0)); // mTvLive.setText(String.format("RGB活体检测耗时 :%s ms", 0));
// mTvLiveScore.setText(String.format("RGB活体检测结果 :%s", false)); // mTvLiveScore.setText(String.format("RGB活体检测结果 :%s", false));
// mTvAllTime.setText(String.format("总耗时 :%s ms", 0)); // mTvAllTime.setText(String.format("总耗时 :%s ms", 0));
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#fec133"));
textCompareStatus.setText("未检测到人脸");
return; 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()) { if (!livenessModel.isQualityCheck()) {
@ -3201,6 +3225,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi
LogManager.logError(TAG, "清空画布时发生异常", 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"); LogManager.logInfo(TAG, "摄像头已暂停,请求计数: " + pauseRequestCount + ", 超时时间: " + "ms");
} }
/** /**

5
financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java

@ -856,9 +856,10 @@ public class FaceSDKManager {
if(deviceType == 6){ if(deviceType == 6){
Log.e("FaceSDKManager", "switchCamera--第7批"); Log.e("FaceSDKManager", "switchCamera--第7批");
SingleBaseConfig.getBaseConfig().setVideoDirection(90); SingleBaseConfig.getBaseConfig().setVideoDirection(90);
SingleBaseConfig.getBaseConfig().setRgbVideoDirection(90);
SingleBaseConfig.getBaseConfig().setRgbVideoDirection(90); //视频流方向
SingleBaseConfig.getBaseConfig().setDetectDirection(270); SingleBaseConfig.getBaseConfig().setDetectDirection(270);
SingleBaseConfig.getBaseConfig().setRgbDetectDirection(270);
SingleBaseConfig.getBaseConfig().setRgbDetectDirection(270); //检测方向
SingleBaseConfig.getBaseConfig().setFramesThreshold(10);
// SingleBaseConfig.getBaseConfig().setMirrorDetectRGB(0); // SingleBaseConfig.getBaseConfig().setMirrorDetectRGB(0);
}else if(deviceType == 5){ }else if(deviceType == 5){
Log.e("FaceSDKManager", "switchCamera--第6批"); Log.e("FaceSDKManager", "switchCamera--第6批");

10
financelibrary/src/main/java/com/baidu/idl/face/main/finance/model/BaseConfig.java

@ -29,9 +29,9 @@ public class BaseConfig {
// 默认为80px可传入大于50px的数值小于此大小的人脸不予检测 // 默认为80px可传入大于50px的数值小于此大小的人脸不予检测
private int minimumFace = 80; private int minimumFace = 80;
// 人脸置信度用于表征被检测到的物体是人脸的概率该阈值设置越高检测越严格建议在0.3-0.8区间内调整阈值 // 人脸置信度用于表征被检测到的物体是人脸的概率该阈值设置越高检测越严格建议在0.3-0.8区间内调整阈值
private float faceThreshold = 0.5f;
private float faceThreshold = 0.6f;
// 模糊度设置默认0.5取值范围[0~1]0是最清晰1是最模糊 // 模糊度设置默认0.5取值范围[0~1]0是最清晰1是最模糊
private float blur = 0.8f;
private float blur = 0.7f;
// 光照设置默认0.8.取值范围[0~1], 数值越大光线越强 // 光照设置默认0.8.取值范围[0~1], 数值越大光线越强
private float illum = 0.8f; private float illum = 0.8f;
// 姿态阈值 // 姿态阈值
@ -158,7 +158,7 @@ public class BaseConfig {
// 6:奥比中光Deeyea(结构光) // 6:奥比中光Deeyea(结构光)
// 7:华捷艾米A100SA200(结构光) // 7:华捷艾米A100SA200(结构光)
// 8:Pico DCAM710(ToF) // 8:Pico DCAM710(ToF)
private int cameraType = 0;
private int cameraType = 2;
// 0RGB无镜像1有镜像 // 0RGB无镜像1有镜像
private int mirrorRGB = 0; private int mirrorRGB = 0;
@ -173,9 +173,9 @@ public class BaseConfig {
// rgb和nir摄像头高 // rgb和nir摄像头高
private int rgbAndNirHeight = 480; private int rgbAndNirHeight = 480;
// depth摄像头宽 // depth摄像头宽
private int depthWidth = 640; //640
private int depthWidth = 480; //640
// depth摄像头高 // depth摄像头高
private int depthHeight = 480; //400
private int depthHeight = 640; //400
// 是否开启最优人脸检测 // 是否开启最优人脸检测
private boolean usingBestImage = true; private boolean usingBestImage = true;

Loading…
Cancel
Save