人脸检测API-坐标

时间:2016-07-19 04:48:16

标签: android android-vision

所以我使用API​​来检测图像中的面部,到目前为止它对我来说效果很好。然而,我无法弄清楚如何将图像裁剪到脸部。我知道如何裁剪Bitmap,但它需要在Bitmap和宽度和高度中获取面的左上角位置。当我使用

查询左上角位置时
    points = face.getPosition();

    Bitmap bmp = Bitmap.createBitmap(bit,(int)points.x,(int)(-1.0*points.y),(int)face.getWidth(),(int)face.getHeight());

但是当我看点时,我注意到y是-63.5555而x是235.6666;我不明白为什么有一个负y坐标。我做了一些Debugging并查看了face对象;我发现它包含一个已经有正x和y坐标的PointF对象。那么为什么在这种情况下会返回负y坐标?

2 个答案:

答案 0 :(得分:3)

边界框估计头部的尺寸,即使它在照片中可能不完全可见。如果通过图像的顶部或左侧裁剪面部,则坐标可以是负的(例如,头部的顶部从图片的顶部裁剪,导致y坐标高于0)。

您在调试中看到的差异是由于实现内部使用头部中心位置来表示位置(大约在眼睛之间的中点),但API将其转换为左上角为方便起见,在调用getPosition时的位置。

另请注意,边界框不一定是脸部的紧密边界。如果您想要更紧凑,则应启用地标检测并计算相对于返回的地标所需的裁剪水平。

答案 1 :(得分:0)

之前我使用过相同的API,并且能够成功裁剪脸部。

尝试

           //Crop face option

           BitmapFactory.Options options = new BitmapFactory.Options();
           options.inPreferredConfig = Bitmap.Config.ARGB_8888;
           //Bitmap bitmap = BitmapFactory.decodeFile(pictureFile.getAbsolutePath(), options);
           Bitmap bitmap = getRotatedImageToUpload(pictureFile.getAbsolutePath());


           Bitmap faceBitmap = Bitmap.createBitmap(bitmap, (int) faceCentre.x, (int) faceCentre.y, (int) faceWidth, (int) faceHeight);

           FileOutputStream out = null;
           try {
               out = new FileOutputStream(getOutputMediaFile());
               faceBitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
               // PNG is a lossless format, the compression factor (100) is ignored
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
               try {
                   if (out != null) {
                       out.close();
                   }
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }

           //End of Crop face option

getRotateImageToUpload的代码是

public Bitmap getRotatedImageToUpload(String filePath) {
        try {
            String file = filePath;
            BitmapFactory.Options bounds = new BitmapFactory.Options();
            bounds.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(file, bounds);

        BitmapFactory.Options opts = new BitmapFactory.Options();
        Bitmap bm = BitmapFactory.decodeFile(file, opts);
        ExifInterface exif = null;

        exif = new ExifInterface(file);

        String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
        int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL;

        int rotationAngle = 0;
        if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90;
        if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180;
        if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270;

        Matrix matrix = new Matrix();
        matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
        Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);
        return rotatedBitmap;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}