You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:02:37