Wednesday, October 17, 2012

Face Detection Example in Android

This example will help you to create face detection application.
Algorithm:
1.) Create a new project by File-> New -> Android Project name it FaceDetectionExample.
2.) Write following into res/values/strings.xml:
1
2
3
4
5
6
7
8
9
10
<resources>
 
    <string name="app_name">FaceDetectionExample</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_face_detection_example">FaceDetectionExample</string>
    <string name="app_info">Click on the \'Take Picture\' to take a picture using Camera and detect the face(s) in the picture taken.</string>
    <string name="take_picture">Take Picture</string>
    <string name="detect_face">Detect Face</string>
</resources>
3.) Create and write following into res/layout/detectlayout.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
         
        <ImageView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/image_view"
                android:layout_weight="1.0"/>
                 
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/detect_face"
                android:text="@string/detect_face"
                android:layout_gravity="center_horizontal"/>
         
</LinearLayout>
4.) Write following into main.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dip">
 
        <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_info"
        android:gravity="center_horizontal"
        android:layout_weight="1.0"/>
         
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/take_picture"
        android:layout_margin="5dip"
        android:text="@string/take_picture"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>
5.) Write following into AndroidManifest.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    package="com.example.facedetectionexample"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".FaceDetectionExample"
            android:label="@string/title_activity_face_detection_example" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
6.) Run for output.
Steps:
1.) Create a project named FaceDetectionExample and set the information as stated in the image.
Build Target: Android 4.0
Application Name: FaceDetectionExample
Package Name: com. example. FaceDetectionExample
Activity Name: FaceDetectionExample
Min SDK Version: 2.2
2.) Open FaceDetectionExample.java file and write following code there:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.example.facedetectionexample;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
 
public class FaceDetectionExample extends Activity {
    private static final int TAKE_PICTURE_CODE = 100;
    private static final int MAX_FACES = 5;
     
    private Bitmap cameraBitmap = null;
     
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     
    ((Button)findViewById(R.id.take_picture)).setOnClickListener(btnClick);
}
 
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
     
            if(TAKE_PICTURE_CODE == requestCode){
                    processCameraImage(data);
            }
    }
 
private void openCamera(){
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
     
    startActivityForResult(intent, TAKE_PICTURE_CODE);
}
 
private void processCameraImage(Intent intent){
    setContentView(R.layout.detectlayout);
     
    ((Button)findViewById(R.id.detect_face)).setOnClickListener(btnClick);
     
    ImageView imageView = (ImageView)findViewById(R.id.image_view);
     
    cameraBitmap = (Bitmap)intent.getExtras().get("data");
     
    imageView.setImageBitmap(cameraBitmap);
}
 
private void detectFaces(){
    if(null != cameraBitmap){
            int width = cameraBitmap.getWidth();
            int height = cameraBitmap.getHeight();
             
            FaceDetector detector = new FaceDetector(width, height,FaceDetectionExample.MAX_FACES);
            Face[] faces = new Face[FaceDetectionExample.MAX_FACES];
             
            Bitmap bitmap565 = Bitmap.createBitmap(width, height, Config.RGB_565);
            Paint ditherPaint = new Paint();
            Paint drawPaint = new Paint();
             
            ditherPaint.setDither(true);
            drawPaint.setColor(Color.RED);
            drawPaint.setStyle(Paint.Style.STROKE);
            drawPaint.setStrokeWidth(2);
             
            Canvas canvas = new Canvas();
            canvas.setBitmap(bitmap565);
            canvas.drawBitmap(cameraBitmap, 0, 0, ditherPaint);
             
            int facesFound = detector.findFaces(bitmap565, faces);
            PointF midPoint = new PointF();
            float eyeDistance = 0.0f;
            float confidence = 0.0f;
             
            Log.i("FaceDetector", "Number of faces found: " + facesFound);
             
            if(facesFound > 0)
            {
                    for(int index=0; index<facesFound; ++index){
                            faces[index].getMidPoint(midPoint);
                            eyeDistance = faces[index].eyesDistance();
                            confidence = faces[index].confidence();
                             
                            Log.i("FaceDetector",
                                            "Confidence: " + confidence +
                                            ", Eye distance: " + eyeDistance +
                                            ", Mid Point: (" + midPoint.x + ", " + midPoint.y + ")");
                             
                            canvas.drawRect((int)midPoint.x - eyeDistance ,
                                                            (int)midPoint.y - eyeDistance ,
                                                            (int)midPoint.x + eyeDistance,
                                                            (int)midPoint.y + eyeDistance, drawPaint);
                    }
            }
             
            String filepath = Environment.getExternalStorageDirectory() + "/facedetect" + System.currentTimeMillis() + ".jpg";
             
                    try {
                            FileOutputStream fos = new FileOutputStream(filepath);
                             
                            bitmap565.compress(CompressFormat.JPEG, 90, fos);
                             
                            fos.flush();
                            fos.close();
                    } catch (FileNotFoundException e) {
                            e.printStackTrace();
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
                     
                    ImageView imageView = (ImageView)findViewById(R.id.image_view);
                     
                    imageView.setImageBitmap(bitmap565);
    }
}
 
    private View.OnClickListener btnClick = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    switch(v.getId()){
                            case R.id.take_picture:         openCamera();   break;
                            case R.id.detect_face:          detectFaces();  break
                    }
            }
    };
}
3.) Compile and build the project.
Note:- For better results check on device.
Output

No comments:

Post a Comment