|
|
@ -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,11 +1258,13 @@ 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; |
|
|
|
} |
|
|
|
|
|
|
@ -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)); |
|
|
|
// 检测图片的坐标和显示的坐标不一样,需要转换。 |
|
|
@ -1445,6 +1463,8 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi |
|
|
|
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()) { |
|
|
@ -3201,6 +3225,16 @@ public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickLi |
|
|
|
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"); |
|
|
|
} |
|
|
|
/** |
|
|
|