9

新しい Android 顔検出モバイル ビジョン API を使用しているときに、フレーム画像を処理しようとしています。

そのため、フレームを取得するカスタム ディテクタを作成し、getBitmap() メソッドを呼び出そうとしましたが、null であるため、フレームのグレースケール データにアクセスしました。それまたは同様のイメージホルダークラスからビットマップを作成する方法はありますか?

public class CustomFaceDetector extends Detector<Face> {
private Detector<Face> mDelegate;

public CustomFaceDetector(Detector<Face> delegate) {
    mDelegate = delegate;
}

public SparseArray<Face> detect(Frame frame) {
    ByteBuffer byteBuffer = frame.getGrayscaleImageData();
    byte[] bytes = byteBuffer.array();
    int w = frame.getMetadata().getWidth();
    int h = frame.getMetadata().getHeight();
    // Byte array to Bitmap here
    return mDelegate.detect(frame);
}

public boolean isOperational() {
    return mDelegate.isOperational();
}

public boolean setFocus(int id) {
    return mDelegate.setFocus(id);
}}
4

2 に答える 2

12

あなたはおそらくこれをすでに整理していますが、将来誰かがこの質問に出くわした場合に備えて、私はそれをどのように解決しましたか:

@ pm0733464 が指摘しているように、出力されるデフォルトの画像形式は NV21 であり、それがCameraSourceandroid.hardware.Cameraで使用されるものです。

このstackoverflowの答えは答えを提供します:

YuvImage yuvimage=new YuvImage(byteBuffer, ImageFormat.NV21, w, h, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, w, h), 100, baos); // Where 100 is the quality of the generated jpeg
byte[] jpegArray = baos.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);

frame.getGrayscaleImageData()提案bitmapは元の画像のグレースケール バージョンになりますが、私の経験ではそうではありません。実際、ビットマップはSurfaceHolderネイティブに提供されるものと同じです。

于 2015-10-10T14:19:26.593 に答える