Face Detection In Xamarin.Android
First we can create our main layout having a button to take picture using camera and name it as:
Main.axml
- <?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="match_parent"
- android:padding="10dip">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Click Take a Picture button"
- 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="Take Picture"
- android:layout_gravity="center_horizontal" />
- </LinearLayout>
- <?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"
- android:src="@android:drawable/ic_menu_report_image" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/detect_face"
- android:text="Detect Face"
- android:layout_gravity="center_horizontal" />
- </LinearLayout>
First we want to open an activity to take picture.
- private void openCamera()
- {
- Intent intent = new Intent (Android.Provider.MediaStore.ActionImageCapture);
- StartActivityForResult (intent, TAKE_PICTURE_CODE);
- }
- private void processCameraImage(Intent intent)
- {
- //Change layout to main Layout
- SetContentView(Resource.Layout.detectlayout);
- Button detect_face = FindViewById<Button> (Resource.Id.detect_face);
- detect_face.Click += detect_face_Clicked;
- ImageView image_view = FindViewById<ImageView> (Resource.Id.image_view);
- //Set image
- image_view.SetImageBitmap(cameraBitmap);
- }
- private void detectFaces(){
- //first check if picture has been taken
- if(null != cameraBitmap){
- //get width of a picture
- int width = cameraBitmap.Width;
- //get height of a picture
- int height = cameraBitmap.Height;
- //Initialize a facedetector with the picture dimensions and the max number of faces to check
- FaceDetector detector = new FaceDetector(width, height, MainActivity.MAX_FACES);
- //Create an array of faces with the number of max faces to check
- FaceDetector.Face[] faces = new FaceDetector.Face[MainActivity.MAX_FACES];
- //create a main bitmap
- Bitmap bitmap565 = Bitmap.CreateBitmap(width, height, Bitmap.Config.Rgb565);
- //create a dither paint
- Paint ditherPaint = new Paint();
- //create a draw paint
- Paint drawPaint = new Paint();
- //set true dither to dither paint variable
- ditherPaint.Dither = true;
- //set color red for the square
- drawPaint.Color = Color.Green;
- //set stroke to style
- drawPaint.SetStyle(Paint.Style.Stroke);
- //set stroke width
- drawPaint.StrokeWidth = 2;
- //Create a canvas
- Canvas canvas = new Canvas();
- //set bitmap to canvas
- canvas.SetBitmap(bitmap565);
- //draw bitmap to canvas
- canvas.DrawBitmap(cameraBitmap, 0, 0, ditherPaint);
- //get a number of faces detected
- int facesFound = detector.FindFaces(bitmap565, faces);
- //mid face point
- PointF midPoint = new PointF();
- //eye distance variable
- float eyeDistance = 0.0f;
- //confidence variable
- float confidence = 0.0f;
- //print numbre of faces found
- System.Console.WriteLine ("Number of faces found: " + facesFound);
- //check if found at least one face
- if(facesFound > 0)
- {
- //for each face draw a red squeare
- for(int index=0; index<facesFound; ++index){
- // get midpoint of a face
- faces[index].GetMidPoint(midPoint);
- //get eye distance
- eyeDistance = faces[index].EyesDistance();
- //get confidence
- confidence = faces [index].Confidence ();
- //print all parameters
- System.Console.WriteLine ("Confidence: " + confidence +
- ", Eye distance: " + eyeDistance +
- ", Mid Point: (" + midPoint.X + ", " + midPoint.Y + ")");
- //draw a square in the picture
- canvas.DrawRect((int)midPoint.X - eyeDistance ,
- (int)midPoint.Y- eyeDistance ,
- (int)midPoint.X + eyeDistance,
- (int)midPoint.Y + eyeDistance, drawPaint);
- }
- }
- //get imageview from layout
- ImageView imageView = (ImageView)FindViewById(Resource.Id.image_view);
- //set image with the red squares to imageview
- imageView.SetImageBitmap(bitmap565);
- }
- }
Click here to view the complete source code in GitHub Repo.
HAPPY CODING (-_-)