首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用检测眨眼

使用检测眨眼
EN

Stack Overflow用户
提问于 2016-01-04 07:29:51
回答 3查看 7.2K关注 0票数 2

我正在使用视觉API进行人脸检测,现在我想实现眨眼,但在一只眼睛闭上时,视觉api仍然检测眼睛。

请帮助我如何实现眨眼功能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-05 16:13:46

脸部的“睁开概率”值是检测眨眼的关键。此外,您还可以使用跟踪器跟踪眼睛状态随时间的变化,以检测表示眨眼的事件序列:

双眼睁开->双眼闭眼->双眼睁开

下面是一个跟踪器示例:

代码语言:javascript
复制
public class BlinkTracker extends Tracker<Face> {
  private final float OPEN_THRESHOLD = 0.85;
  private final float CLOSE_THRESHOLD = 0.15;

  private int state = 0;

  public void onUpdate(Detector.Detections<Face> detections, Face face) {
    float left = face.getIsLeftEyeOpenProbability();
    float right = face.getIsRightEyeOpenProbability();
    if ((left == Face.UNCOMPUTED_PROBABILITY) ||
        (right == Face.UNCOMPUTED_PROBABILITY)) {
      // At least one of the eyes was not detected.
      return;
    }

    switch (state) {
      case 0:
        if ((left > OPEN_THRESHOLD) && (right > OPEN_THRESHOLD)) {
          // Both eyes are initially open
          state = 1;
        }
        break;

        case 1:
          if ((left < CLOSE_THRESHOLD) && (right < CLOSE_THRESHOLD)) {
            // Both eyes become closed
            state = 2;
          }
          break;

        case 2:
          if ((left > OPEN_THRESHOLD) && (right > OPEN_THRESHOLD)) {
            // Both eyes are open again
            Log.i("BlinkTracker", "blink occurred!");
            state = 0;
          }
        break;
    }
  }

}

请注意,您还需要启用“分类”,以便让检测器指示眼睛是否打开/闭着:

代码语言:javascript
复制
FaceDetector detector = new FaceDetector.Builder(context)
    .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
    .build();

然后,将跟踪器添加为处理器,用于从检测器接收面部更新。例如,此配置将用于跟踪视图中最大的面是否眨眼:

代码语言:javascript
复制
detector.setProcessor(
    new LargestFaceFocusingProcessor(detector, new BlinkTracker()));

或者,如果您对检测所有面孔(而不仅仅是最大的脸)的闪烁感兴趣,则可以使用MultiProcessor而不是LargestFaceFocusingProcessor。

票数 7
EN

Stack Overflow用户

发布于 2016-01-04 07:41:49

这个答案假设您已经有了检测面部运行的代码。

Face类具有函数float getIsLeftEyeOpenProbability()float getIsRightEyeOpenProbability(),如果其中一个函数返回一个较大的值,而另一个函数返回一个较小的值,则可以在每个帧上使用它们来确定其中一个眼睛是否眨眼。

Face类的正式文档可以找到这里

票数 1
EN

Stack Overflow用户

发布于 2018-01-23 00:58:17

这里是我使用FaceDetectorAPi()实现眼睛探测器的应用程序,其测试精度超过90%。

代码语言:javascript
复制
private double leftEyeOpenProbability = -1.0;
private double rightEyeOpenProbability = -1.0;

private boolean isEyeBlinked(){

    if(mFaces.size()==0)
        return false;

    Face face = mFaces.valueAt(0);
    float currentLeftEyeOpenProbability = face.getIsLeftEyeOpenProbability();
    float currentRightEyeOpenProbability = face.getIsRightEyeOpenProbability();
    if(currentLeftEyeOpenProbability== -1.0 || currentRightEyeOpenProbability == -1.0){
        return false;
    }

    if(leftEyeOpenProbability>0.9 || rightEyeOpenProbability > 0.9){
        boolean blinked = false;
        if(currentLeftEyeOpenProbability<0.6 || rightEyeOpenProbability< 0.6){
            blinked = true;
        }
        leftEyeOpenProbability = currentLeftEyeOpenProbability;
        rightEyeOpenProbability = currentRightEyeOpenProbability;
        return blinked;
    }else{
        leftEyeOpenProbability = currentLeftEyeOpenProbability;
        rightEyeOpenProbability = currentRightEyeOpenProbability;
        return false;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34586490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档