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>