2017-04-12 18 views
0

私は顔検出を試みており、グーグルビジョンAPIを使用してマスク(グラフィックオーバーレイ)を追加しようとしていますが、問題はマスクを検出して追加した後にカメラからouptutを取得できませんhttps://github.com/googlesamples/android-vision/issues/24からこの解決策を試しましたが、この問題に基づいて私はカスタム検出器クラス Mobile Vision API - concatenate new detector object to continue frame processingを追加しました。 mydetectorクラスHow to create Bitmap from grayscaled byte buffer image?にこれを追加しました。カメラ出力、顔検出、アンドロイドを取得できません

MyDetectorClass

class MyFaceDetector extends Detector<Face> 
{ 
    private Detector<Face> mDelegate; 

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

    public SparseArray<Face> detect(Frame frame) { 
     // *** add your custom frame processing code here 
     ByteBuffer byteBuffer = frame.getGrayscaleImageData(); 
     byte[] bytes = byteBuffer.array(); 
     int w = frame.getMetadata().getWidth(); 
     int h = frame.getMetadata().getHeight(); 
     YuvImage yuvimage=new YuvImage(bytes, 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); 
     Log.e("got bitmap","bitmap val " + bitmap); 
     return mDelegate.detect(frame); 
    } 

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

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

フレーム処理

public SparseArray<Face> detect(Frame frame) 
{ 
    // *** add your custom frame processing code here 
    ByteBuffer byteBuffer = frame.getGrayscaleImageData(); 
    byte[] bytes = byteBuffer.array(); 
    int w = frame.getMetadata().getWidth(); 
    int h = frame.getMetadata().getHeight(); 
    YuvImage yuvimage=new YuvImage(bytes, 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); 
    Log.e("got bitmap","bitmap val " + bitmap); 
    return mDelegate.detect(frame); 
} 

私は回転ビットマップを取得しています、それはマスク(グラフィックオーバーレイ)なしで私は.Howを追加している私はマスクでカメラ出力を得ることができます。

ありがとうございます。

答えて

1

簡単な答えは:できません。

なぜですか? NV21 ByteBufferのAndroidカメラ出力フレーム。また、分離したビットマップのランドマークポイントに基づいてマスクを生成してから結合する必要があります。 申し訳ありませんが、これがAndroid Camera APIの仕組みです。何もできません。手動で行う必要があります。

また、私はカメラのプレビューを取得してからYuvImageに変換してからビットマップに変換しません。このプロセスは、を多く消費し、をリソースとし、プレビューをと非常に非常に遅くにします。

outputFrame = new Frame.Builder().setImageData(mPendingFrameData, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21) 
       .setId(mPendingFrameId) 
       .setTimestampMillis(mPendingTimeMillis) 
       .setRotation(mRotation) 
       .build(); 
mDetector.receiveFrame(outputFrame); 

をすべてのコードがCameraSource.java

で見つけることができます:あなたはそれをやって緩い時間がないので、代わりに私は、はるかに高速になります。このメソッドを使用すると、内部であなたのプレビューを回転させ、
関連する問題