简体   繁体   中英

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. 在此输入图像描述

You can crop your image with the Bitmap.createBitmap() method. Instead of passing whole image (0, 0, width, height), you can specified the rectangle you want (start X, start Y, width, height)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM