Google Play Services Facial Expression Upward Detection, Teach Landmarks (Eyes, Nose, Etc.)

Posted on

getLandmarks() method of com.google.android.gms.vision.face.Face return a listing of Landmarks (eyes, nose, etc.) constitute on the face. A landmark detector must locomote specified via setLandmarkType(int) to bring out landmarks. The landmark detector may non bring out all possible landmarks on whatever given face.

This instance alter from the postal service “Face Detection amongst Google Play services, Mobile Vision API“, amongst laid upwards of “FaceDetector error: Cannot resolve method setTrackingEnabled(boolean)“, add together the characteristic to bring out landmarks on detected faces.


Sets bring out all landmarks, yesteryear calling setLandmarkType(FaceDetector.ALL_LANDMARKS) when build FaceDetector with FaceDetector.Builder.

Then call getLandmarks() for each detected faces.

com.example.androidfacedetection.MainActivity.java

package com.example.androidfacedetection;  import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.SparseArray; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast;  import com.google.android.gms.vision.Frame; import com.google.android.gms.vision.face.Face; import com.google.android.gms.vision.face.FaceDetector; import com.google.android.gms.vision.face.Landmark;  import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List;  world cast MainActivity extends AppCompatActivity {      person static terminal int RQS_LOADIMAGE = 1;     person Button btnLoad, btnDetFace;     person ImageView imgView;     person Bitmap myBitmap;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          btnLoad = (Button)findViewById(R.id.btnLoad);         btnDetFace = (Button)findViewById(R.id.btnDetectFace);         imgView = (ImageView)findViewById(R.id.imgview);          btnLoad.setOnClickListener(new View.OnClickListener(){             @Override             world void onClick(View v) {                 Intent intent = novel Intent();                 intent.setType("image/*");                 intent.setAction(Intent.ACTION_GET_CONTENT);                 intent.addCategory(Intent.CATEGORY_OPENABLE);                 startActivityForResult(intent, RQS_LOADIMAGE);             }         });          btnDetFace.setOnClickListener(new View.OnClickListener(){             @Override             world void onClick(View v) {                 if(myBitmap == null){                     Toast.makeText(MainActivity.this,                             "myBitmap == null",                             Toast.LENGTH_LONG).show();                 }else{                     detectFace();                     Toast.makeText(MainActivity.this,                             "Done",                             Toast.LENGTH_LONG).show();                 }             }         });     }      @Override     protected void onActivityResult(int requestCode, int resultCode, Intent data) {         if (requestCode == RQS_LOADIMAGE                 && resultCode == RESULT_OK){              if(myBitmap != null){                 myBitmap.recycle();             }              endeavour {                 InputStream inputStream =                         getContentResolver().openInputStream(data.getData());                 myBitmap = BitmapFactory.decodeStream(inputStream);                 inputStream.close();                 imgView.setImageBitmap(myBitmap);              } grab (FileNotFoundException e) {                 e.printStackTrace();             } grab (IOException e) {                 e.printStackTrace();             }          }         super.onActivityResult(requestCode, resultCode, data);     }      /*     reference:     https://search-codelabs.appspot.com/codelabs/face-detection      */     person void detectFace(){          //Create a Paint object for drawing amongst         Paint myRectPaint = novel Paint();         myRectPaint.setStrokeWidth(5);         myRectPaint.setColor(Color.GREEN);         myRectPaint.setStyle(Paint.Style.STROKE);          Paint landmarksPaint = novel Paint();         landmarksPaint.setStrokeWidth(10);         landmarksPaint.setColor(Color.RED);         landmarksPaint.setStyle(Paint.Style.STROKE);          //Create a Canvas object for drawing on         Bitmap tempBitmap = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.RGB_565);         Canvas tempCanvas = novel Canvas(tempBitmap);         tempCanvas.drawBitmap(myBitmap, 0, 0, null);          //Detect the Faces           //!!!         //Cannot resolve method setTrackingEnabled(boolean)         //FaceDetector faceDetector = novel FaceDetector.Builder(getApplicationContext()).build();         //faceDetector.setTrackingEnabled(false);          FaceDetector faceDetector =                 novel FaceDetector.Builder(getApplicationContext())                 .setTrackingEnabled(false)                         .setLandmarkType(FaceDetector.ALL_LANDMARKS)                         .build();          Frame frame = novel Frame.Builder().setBitmap(myBitmap).build();         SparseArray<Face> faces = faceDetector.detect(frame);          //Draw Rectangles on the Faces         for(int i=0; i<faces.size(); i++) {             Face thisFace = faces.valueAt(i);             float x1 = thisFace.getPosition().x;             float y1 = thisFace.getPosition().y;             float x2 = x1 + thisFace.getWidth();             float y2 = y1 + thisFace.getHeight();             tempCanvas.drawRoundRect(new RectF(x1, y1, x2, y2), 2, 2, myRectPaint);              //get Landmarks for the starting fourth dimension confront             List<Landmark> landmarks = thisFace.getLandmarks();             for(int l=0; l<landmarks.size(); l++){                 PointF pos = landmarks.get(l).getPosition();                 tempCanvas.drawPoint(pos.x, pos.y, landmarksPaint);             }         }          imgView.setImageDrawable(new BitmapDrawable(getResources(),tempBitmap));      } }  

Other files, AndroidManifest.xml too layout/activity_main.xml, scream to the postal service “Face Detection amongst Google Play services, Mobile Vision API“.

Next:
– Google Play services Face Detection, bring out Smiling