Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crop Detected Face in Android

What I Need:

To Crop out the only exact face from Image.

What I Have Done:

https://github.com/blundell/FaceDetectionTutorialWithPreview

With This way or with

https://github.com/googlesamples/android-vision

Both way I am getting Face Detected. But I am unable to crop the detected Face.

I tried with

Matrix matrix = new Matrix();

        RectF sourceRect = null , destRect = null;

        for (Camera.Face f : mFaces) {

            // Draws a circle at the position of the detected face, with the face's track id below.
            float x = translateX(f.rect.centerX() + f.rect.width() / 2);
            float y = translateY(f.rect.centerY() + f.rect.height() / 2);
            //canvas.drawCircle(x, y, FACE_POSITION_RADIUS, mFacePositionPaint);
            //  canvas.drawText("id: " + mFaceId, x + ID_X_OFFSET, y + ID_Y_OFFSET, mIdPaint);
            // canvas.drawText("happiness: " + String.format("%.2f", face.getIsSmilingProbability()), x - ID_X_OFFSET, y - ID_Y_OFFSET, mIdPaint);
            // canvas.drawText("right eye: " + String.format("%.2f", face.getIsRightEyeOpenProbability()), x + ID_X_OFFSET * 2, y + ID_Y_OFFSET * 2, mIdPaint);
            //canvas.drawText("left eye: " + String.format("%.2f", face.getIsLeftEyeOpenProbability()), x - ID_X_OFFSET*2, y - ID_Y_OFFSET*2, mIdPaint);

            // Draws a bounding box around the face.
            float xOffset = scaleX(f.rect.width() / 2.0f);
            float yOffset = scaleY(f.rect.height() / 2.0f);
            float left = x - xOffset;
            float top = y - yOffset;
            float right = x + xOffset;
            float bottom = y + yOffset;

            sourceRect = new RectF(0, 0, source.getWidth(), source.getHeight());
            destRect = new RectF(left, top, right, bottom);

            Log.v("Margins: ","top: "+top+"\n"+"left: "+left+"\n"+"right: "+right+"\n"+"bottom: "+bottom+"\n");

        }


        matrix.setRectToRect(sourceRect, destRect, Matrix.ScaleToFit.CENTER);

        matrix.postRotate(angle);

        return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                matrix, true);

The same code working for drawing it for canvas but while cropping its not working.

For Now, I am taking pictures of the whole view. Just need the way how to crop from that image like below. enter image description here

like image 643
Tapan Kumar Patro Avatar asked Sep 17 '18 11:09

Tapan Kumar Patro


People also ask

What is crop face?

Face Crop is a face dretection batch croppign system for Photoshop. It is the ONLY software in the industry that has a true chin to top of subject algorithm. Tall hair, granduation caps, hair bows, ect.

What is face detection on Android?

Android Face detection API tracks face in photos, videos using some landmarks like eyes, nose, ears, cheeks, and mouth. Rather than detecting the individual features, the API detects the face at once and then if defined, detects the landmarks and classifications.


1 Answers

Hi Guys Thanks for your time. I successfully cropped the images out of source bitmap using opencv.

Link i followed OpenCv Code

Code To Save cropped Face.

if ((facesArray.length>0) && (faceState==SEARCHING))
        {
            Mat m=new Mat();
            m=mGray.submat(facesArray[0]);
            mBitmap = Bitmap.createBitmap(m.width(),m.height(), Bitmap.Config.ARGB_8888);


            Utils.matToBitmap(m, mBitmap);
            Message msg = new Message();
            String textTochange = "IMG";
            msg.obj = textTochange;
            //mHandler.sendMessage(msg);

            textTochange = fr.predict(m);
            mLikely=fr.getProb();
            msg = new Message();
            msg.obj = textTochange;
            mHandler.sendMessage(msg);


            //for saving added below code

            bmpToSave = Bitmap.createBitmap(m.width(), m.height(), Bitmap.Config.ARGB_8888);

            Utils.matToBitmap(m,bmpToSave);
            bmpToSave= Bitmap.createScaledBitmap(bmpToSave, 128, 128, false);


            File pictureFile = getOutputMediaFile();

            Log.v("path: ", "" + pictureFile.getAbsolutePath());
            Log.v("path: ", "" + pictureFile.getPath());



            ///storage/emulated/0/ABC/MI_04092018_1218.jpg

            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                bmpToSave.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                fos.close();

            } catch (FileNotFoundException e) {
                Log.d("FD", "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d("FD", "Error accessing file: " + e.getMessage());
            }

Credit goes to MIT

like image 149
Tapan Kumar Patro Avatar answered Oct 30 '22 05:10

Tapan Kumar Patro