Google Vision API使用图形叠加功能捕获图像

时间:2016-06-14 10:21:20

标签: android google-api google-vision

我正在使用api face tracker示例中的一个,我修改了一下代码,看它是否会根据我对app的想法发挥作用。我想要做的是我想在检测到脸后添加面罩。

到目前为止我做了什么,我添加了一个可绘制的样本面具,当我检测到一个面部而不是绘制面部点时,我在面部跟踪矩形中绘制了可绘制的。现在它显示在面部预览中的面具但是当我尝试捕获该图像时它只从相机捕获帧而不是图形覆盖我添加了掩模。有什么方法可以从相机上捕捉到那个面具吗?

Image being saved

image being displayed on mobile screen

1 个答案:

答案 0 :(得分:0)

我在过去曾参与过的项目中已经取得了与此类似的功能,但无法再访问该项目。

当您调用捕获方法时,您需要存储对面部位置的引用。

我不确定视觉api对你提供多少控制权,所以你要么:

拍摄照片,在保存文件之前,将掩码资源添加到返回的位图之上。

加载保存的文件,将掩码资源添加到它上面。

如果能有所帮助,我稍后会看一些代码。

编辑旋转位图

bitmap = android.provider.MediaStore.Images.Media
                .getBitmap(cr, selectedImage);
ExifInterface exif = new ExifInterface("/storage/emulated/0/Pic.jpg");     
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
int i = Integer.parseInt(exifOrientation);
bitmap = rotateImage(bitmap, i);

//

private Bitmap rotateImage(Bitmap bm, int i) {
    Matrix matrix = new Matrix();
    switch (i) {
        case ExifInterface.ORIENTATION_NORMAL:
            return bm;
        case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
            matrix.setScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            matrix.setRotate(180);
            break;
        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            matrix.setRotate(180);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_TRANSPOSE:
            matrix.setRotate(90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.setRotate(90);
            break;
        case ExifInterface.ORIENTATION_TRANSVERSE:
            matrix.setRotate(-90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.setRotate(-90);
            break;
        default:
            return bm;
    }
    try {
        Bitmap bmRotated = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
        bm.recycle();
        return bmRotated;
    } catch (OutOfMemoryError e) {
        e.printStackTrace();
        return null;
    }
}