android - 在 Android 中裁剪检测到的人脸

标签 android crop face-detection

我需要什么:

从图像中裁剪出唯一准确的人脸。

我做了什么:

https://github.com/blundell/FaceDetectionTutorialWithPreview

用这种方式或用

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

两种方式我都检测到人脸。但是我无法裁剪检测到的人脸。

我试过

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);

相同的代码适用于在 Canvas 上绘制它,但在裁剪时不起作用。

现在,我正在拍摄整个景色。只需要如何从该图像中裁剪的方式,如下所示。 enter image description here

最佳答案

大家好感谢您抽出时间。我使用 opencv 成功地从源位图中裁剪了图像。

我关注的链接 OpenCv Code

保存裁剪面的代码。

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());
            }

归功于 MIT

关于android - 在 Android 中裁剪检测到的人脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52367169/

相关文章:

android - 如何在 Camera2 API Android 中捕获叠加层内的图像?

face-detection - 如何为人脸检测器的adaboost方法指定弱分类器的阈值

ios - Swift:裁剪和导出视频

java - Android Studio : NullPointerException when trying to click on a object in a list and start a new activity

android - CSS 来显示响应式 Nag Bar?

android - 如何以编程方式在android中打开目录

shell - 如何通过命令行从视频中裁剪矩形?

android - 通过面部检测代码进行OpenCV对象检测-ANDROID

ios - ML Kit iOS 人脸检测漏洞

android - 在移动平台上使用 SVM 或神经网络哪个更​​有效?