Wednesday 18 September 2013

Face Detection example in andoid from Gallery and by Camera capure image

Hello Every one ,

I recently learn face detection  in android by searching in google and other blogger i found below code and i have made some change in it .

Hope you will like my code and also shared your information in image processing and your expose in face detection in android.


Below is my android Activity code :



public class FaceDetectActivity extends Activity  implements OnClickListener{

        private static final int TAKE_PICTURE_CODE = 100;
        private static final int MAX_FACES = 5;
        
        private static final int SELECT_PICTURE = 6;
       
        private Bitmap cameraBitmap = null;
        private Button btn_TakePhoto;
       
        private Button btn_select_image;
       
        private Button btn_facedetect;
        
        private ImageView imageView;
       
        private int mWidth;
        private int mHeight;
       
        private ProgressDialog mProgressDialog;
       
        private Button btn_select_img;
       
      
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_face_detect);
       
        initDisplay();
       
        btn_TakePhoto=(Button)findViewById(R.id.take_picture);
        btn_TakePhoto.setOnClickListener(this);
        btn_select_img=(Button)findViewById(R.id.btn_select_gallary);
        btn_select_img.setOnClickListener(this);
       
       
       
    }


   
   
    private void initDisplay(){
       
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        mHeight=metrics.heightPixels;
        mWidth=metrics.widthPixels;
       
        Log.v("LOG_TAG", "Wdith is "+ mWidth +"Height is "+ mHeight);
    }
   
   
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.face_detect, menu);
        return true;
    }

   
   
    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.face_detect_layout);
        
        btn_facedetect=(Button)findViewById(R.id.detect_face);
        btn_facedetect.setOnClickListener(this);
        
       
       
        btn_select_image=(Button)findViewById(R.id.btn_pickimag);
       
        btn_select_image.setOnClickListener(this);
       
       
        imageView= (ImageView)findViewById(R.id.image_view);
        
        cameraBitmap = (Bitmap)intent.getExtras().get("data");
        
        imageView.setImageBitmap(cameraBitmap);
    }

    @Override
    public void onClick(View v) {
       
        switch(v.getId()){
       
        case R.id.take_picture:
           
            openCamera();
            break;
           
        case R.id.detect_face:
           
            //detectFaces();
           
            new FaceDetectAsyncTask().execute(cameraBitmap);
           
            break;
           
        case R.id.btn_pickimag:
           
            startImagePicker();
           
            break;
       
           
        case R.id.btn_select_gallary:
           
            startImagePicker();
           
            break;
       
        }
       
    }
   
   
   
    private Object[] detectFaces(Bitmap mBitmap){
      
        Object[] mObject = new Object[2];
       
        if(null != mBitmap){
               
               int width = mBitmap.getWidth();
                int height = mBitmap.getHeight();
                
                FaceDetector detector = new FaceDetector(width, height,FaceDetectActivity.MAX_FACES);
                Face[] faces = new Face[FaceDetectActivity.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.GREEN);
                drawPaint.setStyle(Paint.Style.STROKE);
                drawPaint.setStrokeWidth(2);
                
                Canvas canvas = new Canvas();
                canvas.setBitmap(bitmap565);
                canvas.drawBitmap(mBitmap, 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);
                        }
                }else{
                    //Toast.makeText(this, "No Face Detect", Toast.LENGTH_SHORT).show();
                }
                
                /*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);*/
               
                mObject[0]=facesFound;
                mObject[1]=bitmap565;
               
                        return mObject;
        }
       
        return mObject;
    }
   
   
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if(TAKE_PICTURE_CODE == requestCode){
                   
                if(Activity.RESULT_OK==resultCode){
                    processCameraImage(data);
                }else{
                    Toast.makeText(this, "You have not capture Image", Toast.LENGTH_SHORT).show();
                   
                     setContentView(R.layout.face_detect_layout);
                    
                        btn_facedetect=(Button)findViewById(R.id.detect_face);
                        btn_facedetect.setOnClickListener(this);
                        
                       
                       
                        btn_select_image=(Button)findViewById(R.id.btn_pickimag);
                       
                        btn_select_image.setOnClickListener(this);
                       
                       
                        imageView= (ImageView)findViewById(R.id.image_view);
                }
               
            }else if(SELECT_PICTURE==requestCode){
               
               
                if(Activity.RESULT_OK==resultCode){
                   
                    Uri selectedImageUri = data.getData();
                    String selectedImagePath = getPath(selectedImageUri);
                   
                   
                    setContentView(R.layout.face_detect_layout);
                   
                    btn_facedetect=(Button)findViewById(R.id.detect_face);
                    btn_facedetect.setOnClickListener(this);
                    
                   
                   
                    btn_select_image=(Button)findViewById(R.id.btn_pickimag);
                   
                    btn_select_image.setOnClickListener(this);
                   
                   
                    imageView= (ImageView)findViewById(R.id.image_view);
                   
                    updateImageFromGallary(selectedImagePath);
                   
                   
                   
                   
                   
                }else{
                   
                }
               
            }
           
           
    }
   
   
    private void updateImageFromGallary(String imgPath){
       
        try{
           
            cameraBitmap=null;
           
            //cameraBitmap=BitmapFactory.decodeFile(imgPath);
           
            cameraBitmap=decodeSampledBitmapFromResource(getResources(),imgPath,mWidth,mHeight);
           
            imageView.setImageBitmap(cameraBitmap);
           
            Toast.makeText(this, "Press Face detect for Face Detection", Toast.LENGTH_SHORT).show();
           
        }catch(OutOfMemoryError outMemeoryError){
           
            Toast.makeText(this, "Unable to Load Image", Toast.LENGTH_SHORT).show();
           
        }
       
       
       
       
    }
   
   
    private void startImagePicker(){
       
        // in onCreate or any event where your want the user to
        // select a file
        /*Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);*/
        Intent intent = new Intent(Intent.ACTION_PICK,
                   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
       
        startActivityForResult(Intent.createChooser(intent,
                "Select Picture"), SELECT_PICTURE);
       
    }
   
   
    public String getPath(Uri uri) {
       
       
       
         Uri selectedImage = uri;
         String[] filePathColumn = {MediaStore.Images.Media.DATA};

         Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        
         cursor.moveToFirst();

         int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
         String filePath = cursor.getString(columnIndex);
       
         return filePath;
       
       /* String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);*/
    }
   
   
    public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and width
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }

    return inSampleSize;
}
   
   
    public static Bitmap decodeSampledBitmapFromResource(Resources res, String path,
            int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
       // BitmapFactory.decodeResource(res, resId, options);
       // BitmapFactory.decodeFile(path);
       
        BitmapFactory.decodeFile(path, options);
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
       //return BitmapFactory.decodeResource(res, resId, options);
       
        return  BitmapFactory.decodeFile(path, options);
    }
   
   
   
    public class FaceDetectAsyncTask extends AsyncTask<Bitmap, Void, Object[]>{

       
       
        @Override
        protected void onPostExecute(Object[] result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
           
           
           
            dismissProgressDialog();
           
            if(result!=null){
               
                if(result[0]!=null){
                   
                    int faceDetect=(Integer) result[0];
                    if(faceDetect>0){
                       
                        ImageView imageView = (ImageView)findViewById(R.id.image_view);
                        
                        imageView.setImageBitmap((Bitmap) result[1]);
                    }else{
                        Toast.makeText(FaceDetectActivity.this, "No Face Detect", Toast.LENGTH_SHORT).show();
                    }
                }else{
                    Toast.makeText(FaceDetectActivity.this, "No Face Detect", Toast.LENGTH_SHORT).show();
                }
               
               
            }
           
           
           
           
           
        }

        /*@Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
           
             dismissProgressDialog();
           
             ImageView imageView = (ImageView)findViewById(R.id.image_view);
            
             imageView.setImageBitmap(result);
            
           
        }
*/
        @Override
        protected void onPreExecute() {
           
            super.onPreExecute();
           
            showProgressDialog();
        }

        @Override
        protected Object[] doInBackground(Bitmap... params) {
            // TODO Auto-generated method stub
           
            Bitmap mBitmap=params[0];
            Object [] mObjArray;
           
            mObjArray=detectFaces(mBitmap);
           
            return mObjArray;
        }

       
    }
   
   
    private void showProgressDialog(){
       
        if(mProgressDialog!=null && mProgressDialog.isShowing()){
            return ;
        }else{
            mProgressDialog=new ProgressDialog(this);
           
            mProgressDialog.setTitle("Please wait...");
           
            mProgressDialog.setMessage("Detecting face from image");
           
            mProgressDialog.setCancelable(false);
           
            mProgressDialog.show();
        }
    }
   
    private void dismissProgressDialog(){
   
        if(mProgressDialog!=null && mProgressDialog.isShowing()){
            mProgressDialog.dismiss();
            mProgressDialog=null;
        }
    }
   
   
}


Here are my layout files  code:

activity_face_detection.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".FaceDetectActivity"
    android:gravity="center"
     >

     <!-- <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"
        android:id="@+id/txt_appinfo"
        /> -->
        
    <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"
        android:layout_centerHorizontal="true"
       
       
        />
   
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_select_gallary"
        android:layout_margin="5dip"
        android:text="@string/select_image_from_gallary"
        android:layout_gravity="center_horizontal"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/take_picture"
        />

</RelativeLayout>

face_detect_layout.xml



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.0"
         />
   
   
   
   
    <LinearLayout
       
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         >
       
         <Button
        android:id="@+id/detect_face"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       
        android:text="@string/detect_face"
        android:layout_gravity="center_vertical"
         />
        
          <Button
        android:id="@+id/btn_pickimag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       android:layout_gravity="center_vertical"
        android:text="@string/select_image_from_gallary" />
       
    </LinearLayout>

  

</LinearLayout>