0

私はAPIフェイストラッカーサンプルの1つを使用しており、アプリのアイデアに従って機能するかどうかを確認するためにコードを少し変更しました。私がやりたいのは、顔を検出した後にフェイスマスクを追加したいということです。

これまでに行ったことは、サンプル マスク ドローアブルを追加したことです。顔のポイントを描画する代わりに顔を検出すると、顔追跡長方形にドローアブルを描画します。顔のプレビューにそのマスクが表示されるようになりましたが、その画像をキャプチャしようとすると、マスクを追加したグラフィックオーバーレイではなく、カメラからフレームのみがキャプチャされます。そのマスクをカメラからキャプチャする方法はありますか?

保存中の画像

モバイル画面に表示されている画像

4

1 に答える 1

0

過去に取り組んだプロジェクトでこれと同様のことを達成しましたが、プロジェクトにアクセスできなくなりました。

キャプチャ メソッドを呼び出すときは、顔の位置への参照を保存する必要があります。

Vision 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;
    }
}
于 2016-06-27T15:32:44.683 に答える