My Blog List

Wednesday 22 August 2012

Face Detection in Android




Hi, fellas
Today i am gonna show you how you can detect face in given bitmap .Android Provides some classes and its associate constructor and method through which you can easily detect a face even eye position in given bitmap .So first take a look on below class description from http://developer.android.com/reference/android/media/FaceDetector.html#FaceDetector(int, int, int)


1.FaceDetector

extends Object
java.lang.Object
   ↳android.media.FaceDetector

Class Overview


Identifies the faces of people in a Bitmap graphic object.


2.

Public Constructors


public FaceDetector (int width, int height, int maxFaces)

Since: API Level 1
Creates a FaceDetector, configured with the size of the images to be analysed and the maximum number of faces that can be detected. These parameters cannot be changed once the object is constructed. Note that the width of the image must be even.
Parameters
widththe width of the image
heightthe height of the image
maxFacesthe maximum number of faces to identify
3.

Public Methods


public int findFaces (Bitmap bitmap, Face[] faces)

Since: API Level 1
Finds all the faces found in a given Bitmap. The supplied array is populated with FaceDetector.Faces for each face found. The bitmap must be in 565 format (for now).
Parameters
bitmapthe Bitmap graphic to be analyzed
facesan array in which to place all found FaceDetector.Faces. The array must be sized equal to the maxFaces value set at initialization
Returns
  • the number of faces found
Here we go....
1.Create your Project ,name it as FaceDetectionDemo
2.Create FaceDetectionActivity
In your onCreate method write setContentView(new MyView(this)); after call to super.
public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
       setContentView(new MyView(this));
}
3.So next step is to create MyView class

private class MyView extends View
    {
    private Bitmap myBitmap;
    private int width, height;
    private FaceDetector.Face[] detectedFaces;
    private int NUMBER_OF_FACES=2;
    private FaceDetector faceDetector;
    private int NUMBER_OF_FACE_DETECTED;
    private float eyeDistance;
    
public MyView(Context context) 
{
super(context);
BitmapFactory.Options bitmapFatoryOptions=new BitmapFactory.Options();
bitmapFatoryOptions.inPreferredConfig=Bitmap.Config.RGB_565;
myBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.fourface,bitmapFatoryOptions);
width=myBitmap.getWidth();
height=myBitmap.getHeight();
detectedFaces=new FaceDetector.Face[NUMBER_OF_FACES];
faceDetector=new FaceDetector(width,height,NUMBER_OF_FACES);
NUMBER_OF_FACE_DETECTED=faceDetector.findFaces(myBitmap, detectedFaces);
}
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawBitmap(myBitmap, 0,0, null);
Paint myPaint = new Paint();
            myPaint.setColor(Color.GREEN);
            myPaint.setStyle(Paint.Style.STROKE); 
            myPaint.setStrokeWidth(3);

            for(int count=0;count<NUMBER_OF_FACE_DETECTED;count++)
            {
            Face face=detectedFaces[count];
            PointF midPoint=new PointF();
            face.getMidPoint(midPoint);
            
            eyeDistance=face.eyesDistance();
            canvas.drawRect(midPoint.x-eyeDistance, midPoint.y-eyeDistance, midPoint.x+eyeDistance, midPoint.y+eyeDistance, myPaint);
            }
}
    
    }
Let me Explain the Constructor


  • For FaceDetection we need to convert in bitmap format that too in RGB_565.
  • Now get the image from the drawable folder. Get the width and height of image.
  • Now the reason I feel this API the simplest is coming now.
  • You need to pass the number of faces you want to detect.It will return the array of Face type.Last three lines is having logic for that.So you must declare an array with the size of number of faces you want to detect.
Now when the face gets detected we will draw a red rectangle on it.For that we need to write few lines in our onDraw method.
  • drawRect is taking five parameter left x,y and top x,y coordinate.From that given pint it will start drawing rectangle.We need to pass paint object also.



That's all run your project and it will detect faces and drawRect on given bitmap
enjoy!
for more query plz mail me @bpsingh216@gmail.com

1 comment:

  1. sir whether its possible to check whether eyes are open or not by counting the pixel..for that can you help me in cutting the face region(the rectangled one)..

    ReplyDelete