首页 > 解决方案 > 谷歌移动视觉 api - 将面部裁剪为来自相机的位图

问题描述

我试图在将检测到的人脸转换为位图后从相机中裁剪它onPictureTaken,但是在人脸区域上没有正确裁剪,如何从相机中裁剪人脸位图?

在此处输入图像描述

mCameraSource.takePicture(null, new CameraSource.PictureCallback() {

  @Override
  public void onPictureTaken(byte[] bytes) {

    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inDensity = DisplayMetrics.DENSITY_DEFAULT;
    opt.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
    opt.inScaled = false;
    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);

    Bitmap croppedFace = Bitmap.createBitmap(bmp, (int) facePosition.x, (int) facePosition.y, (int) faceWidth, (int) faceHeight);
    ivProfileImg.setImageBitmap(croppedFace);

  }
});

其中 facePosition 来自Tracker

private class GraphicFaceTracker extends Tracker<Face> {
    private GraphicOverlay mOverlay;
    private FaceGraphic mFaceGraphic;

    GraphicFaceTracker(GraphicOverlay overlay) {
        mOverlay = overlay;
        mFaceGraphic = new FaceGraphic(overlay);
    }

    @Override
    public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) {
        mOverlay.add(mFaceGraphic);
        mFaceGraphic.updateFace(face);

        //for cropping face
        facePosition = face.getPosition();
        faceWidth = face.getWidth();
        faceHeight = face.getHeight();

    }
}

更新:我设法通过反复试验来裁剪面部,添加代码以调整bmp为 1080 宽度,并facePosition使用 1.5 缩放值,但我仍然不确定替换这些硬编码值的正确代码是什么:

在此处输入图像描述

mCameraSource.takePicture(null, new CameraSource.PictureCallback() {

  @Override
  public void onPictureTaken(byte[] bytes) {

    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inDensity = DisplayMetrics.DENSITY_DEFAULT;
    opt.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
    opt.inScaled = false;
    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);//2976, 3968

    //resized to 1080
    int resizedHeight = 1080*bmp.getHeight()/bmp.getWidth();
    bmp = Bitmap.createScaledBitmap(bmp,1080, resizedHeight, true);//1080, 1440

    //scale facePosition values to x1.5
    float scale = 1.5f;
    int screenX = (int)facePosition.x * scale;
    int screenY = (int)facePosition.y * scale;
    float fw = faceWidth * scale;
    float fh = faceHeight * scale;

    Bitmap croppedFace = Bitmap.createBitmap(bmp, screenX, screenY, (int) fw, (int) fh);
    ivProfileImg.setImageBitmap(croppedFace);

  }
});

标签: androidface-detectiongoogle-vision

解决方案


推荐阅读