Android人脸检测onUpdate方法每秒调用4次导致眨眼计数变量numbOfBlinks异常累加的问题解决咨询
解决眨眼次数重复计数的问题
我明白你的困扰了——因为onUpdate方法每秒会被调用4次,所以每次闭眼状态都会触发多次numbOfBlinks++,导致计数虚高。核心要抓住的点是:一次完整的眨眼是「闭眼→睁眼」的闭环动作,我们只需要在这个动作完成时计数一次,而不是每次检测到闭眼就累加。
你的代码问题分析
看你修改后的代码,虽然添加了onEyesClosed()和onEyesOpened()方法,但错误地在else(闭眼检测)分支里还保留了numbOfBlinks++,这就导致了双重计数。而且原始逻辑里只要检测到闭眼就累加,完全没考虑「完整眨眼」的动作闭环,自然会出现计数多4倍的问题。
修正后的完整代码
// 新增状态变量,记录当前眼睛是否处于闭合状态 private boolean isEyesClosed = false; @Override public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) { mOverlay.add(mFaceGraphic); mFaceGraphic.updateFace(face); if (flag == 0) { eye_tracking(face); } } // 标记眼睛进入闭合状态 private void onEyesClosed() { isEyesClosed = true; } // 处理眼睛睁开的动作——只有从闭眼切换到睁眼时,才计数一次眨眼 private void onEyesOpened() { if (isEyesClosed) { // 完成一次完整眨眼,计数+1 numbOfBlinks++; Log.i(TAG,"numb of blinks: " + numbOfBlinks); } isEyesClosed = false; } private void eye_tracking(Face face) { float leftEye = face.getIsLeftEyeOpenProbability(); float rightEye = face.getIsRightEyeOpenProbability(); if (leftEye > THRESHOLD && rightEye > THRESHOLD) { state_i = 0; firstTime = true; firstTimeSMS = true; onEyesOpened(); // Log.i(TAG, "onUpdate: Open Eyes Detected"); } else { onEyesClosed(); if (state_i == 0) { lastLowToHighState = SystemClock.elapsedRealtime(); lastLowToHighStateSMS = SystemClock.elapsedRealtime(); } if (firstTime && SystemClock.elapsedRealtime() - lastLowToHighState > alarmTime) { lastLowToHighState = SystemClock.elapsedRealtime(); firstTime = false; alert_box(); flag = 1; } if (firstTimeSMS && SystemClock.elapsedRealtime() - lastLowToHighStateSMS > smsTime) { try { sendSMS(); } catch (Exception e) { e.printStackTrace(); } lastLowToHighStateSMS = SystemClock.elapsedRealtime(); firstTimeSMS = false; } // 移除这里的numbOfBlinks++!!!避免重复计数 state_i = 1; // Log.d(TAG, "onUpdate: Closed Eyes Detected"); } }
关键改进点
- 彻底移除了
else分支里的numbOfBlinks++,避免每次检测到闭眼就重复累加 - 只在
onEyesOpened()方法里,当眼睛从闭合状态切换到睁开状态时才计数,确保一次完整眨眼只统计一次 - 用
isEyesClosed变量跟踪眼睛状态,避免因onUpdate高频调用导致的重复触发计数
这样就能完美解决计数虚高的问题,准确统计用户的眨眼次数了。
内容的提问来源于stack exchange,提问作者ReeceG
相关产品推荐
相关产品推荐

