2017-02-08 7 views
1

Я изучаю замечательное мобильное видение apis, я работаю над примером Face Tracker и ищу решение, где я могу узнать, открыт ли рот открытым или нет. например человек зевает. Существует нет прямого способа, как face.getIsLeftEyeOpenProbability();Android Mobile Vision API обнаруживает, что рот открыт

Так что я думаю, что мне нужно выяснить координаты x, y как левого, так и правого уха, выяснить разницу и выяснить, открыта или нет мышь. Я не уверен, что это сработает или нет.

Но есть ли другой способ узнать, открыт ли рот открытым или закрытым?

ответ

1

К сожалению, Mobile Vision API не поддерживает обнаружение открытого открывания.

4

Mobile Vision API не дает прямой поддержки обнаружению/открыванию рта. Но этот код может вам помочь. Я испытал и работал на моем устройстве.

@Override 
    public void draw(Canvas canvas) { 

     Face face = mFace; 

     if (face == null) { 
      return; 
     } 

     if ((contains(face.getLandmarks(), 11) != 99) 
       && (contains(face.getLandmarks(), 5) != 99) 
       && (contains(face.getLandmarks(), 6) != 99) 
       ) { 

      Log.i(TAG, "draw: Mouth Open >> found all the points"); 

      /** 
      * for bottom mouth 
      */ 
      int cBottomMouthX; 
      int cBottomMouthY; 
      if (FaceTrackerActivity.mIsFrontFacing) { 
       cBottomMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 0)).getPosition().x); 
       cBottomMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 0)).getPosition().y); 

       Log.i(TAG, "draw: Condition Bottom mouth >> cBottomMouthX >> " + cBottomMouthX + " cBottomMouthY >> " + cBottomMouthY); 


      } else { 
       cBottomMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 0)).getPosition().x); 
       cBottomMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 0)).getPosition().y); 
      } 
      canvas.drawCircle(cBottomMouthX, cBottomMouthY, 10, mPaint); 

      /** 
      * for left mouth 
      */ 
      int cLeftMouthX; 
      int cLeftMouthY; 
      if (FaceTrackerActivity.mIsFrontFacing) { 
       cLeftMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().x); 
       cLeftMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().y); 

       Log.i(TAG, "draw: Condition LEft mouth >> cLeftMouthX >> " + cLeftMouthX + " cLeftMouthY >> " + cLeftMouthY); 


      } else { 
       cLeftMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().x); 
       cLeftMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 5)).getPosition().y); 
      } 
      canvas.drawCircle(cLeftMouthX, cLeftMouthY, 10, mPaint); 

      /** 
      * for Right mouth 
      */ 
      int cRightMouthX; 
      int cRightMouthY; 
      if (FaceTrackerActivity.mIsFrontFacing) { 
       cRightMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().x); 
       cRightMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().y); 

       Log.i(TAG, "draw: Condition Right mouth >> cRightMouthX >> " + cRightMouthX + " cRightMouthY >> " + cRightMouthY); 


      } else { 
       cRightMouthX = (int) translateX(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().x); 
       cRightMouthY = (int) translateY(face.getLandmarks().get(contains(face.getLandmarks(), 11)).getPosition().y); 
      } 
      canvas.drawCircle(cRightMouthX, cRightMouthY, 10, mPaint); 

      float centerPointX = (cLeftMouthX + cRightMouthX)/2; 
      float centerPointY = ((cLeftMouthY + cRightMouthY)/2) - 20; 

      canvas.drawCircle(centerPointX, centerPointY, 10, mPaint); 

      float differenceX = centerPointX - cBottomMouthX; 
      float differenceY = centerPointY - cBottomMouthY; 

      Log.i(TAG, "draw: difference X >> " + differenceX + "  Y >> " + differenceY); 

      if (differenceY < (-60)) { 
       Log.i(TAG, "draw: difference - Mouth is OPENED "); 
      } else { 
       Log.i(TAG, "draw: difference - Mouth is CLOSED "); 
      } 
     } 
    } 

И вот еще один способ.

int contains(List<Landmark> list, int name) { 
    for (int i = 0; i < list.size(); i++) { 
     if (list.get(i).getType() == name) { 
      return i; 
     } 
    } 
    return 99; 
} 

P.S - Этот код будет найти найти центральную точку cordinates левого и правого рта и найти разницу между Bottom cordinates рта и центра указывает cordinates.

+0

Здравствуйте @KulsDroid, возможно, я знаю, где вы получаете этот метод mIsFrontFacing. Я получаю ошибку здесь .. if (FaceTrackerActivity.mIsFrontFacing) { – Shadow

Смежные вопросы