2017-01-20 8 views
3

カメラ2モジュールでGoogle Mobile Vision APIを使用しようとしています。私は多くの問題を抱えています。カメラ2のビットマップへの出力

Googleのandroid-Camera2Videoサンプルコードをベースに使用しています。 Camera2VideoFragment.javaを含む任意の断片が、その画像へのアクセスを得ることができる方法

Camera2VideoFragment.java

OnCameraImageAvailable mCameraImageCallback; 

public interface OnCameraImageAvailable { 
    void onCameraImageAvailable(Image image); 
} 


ImageReader.OnImageAvailableListener mImageAvailable = new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader reader) { 

     Image image = reader.acquireLatestImage(); 
     if (image == null) 
      return; 

     mCameraImageCallback.onCameraImageAvailable(image); 

     image.close(); 
    } 
}; 

:私は、次のコールバックを含むように変更しました。

今、バーコードAPIはBitmapイメージしか受け入れませんが、YUV_420_888をビットマップに変換できません。代わりに、私はJPEGimageReaderのファイル形式を変更し、次の変換コードを実行しました:

Image.Plane[] planes = image.getPlanes(); 
    ByteBuffer buffer = planes[0].getBuffer(); 
    buffer.rewind(); 
    byte[] data = new byte[buffer.capacity()]; 
    buffer.get(data); 
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

これは働いていたが、imageReaderJPEGデータを送るのフレームレートの低下が顕著でした。以前誰かがこの問題を回避してくれたかどうかは疑問だ。

答えて

1

遅い回答ですが、うまくいけばまだ役立ちます。彼のExampleエセキエル・エイドリアンとして

は(彼の場合NV21に)サポートされている形式のいずれかにYUV_420_888の変換を説明し、あなたはビットマップ出力を得るために同様のことを行うことができますがあります。

private byte[] convertYUV420888ToNV21(Image imgYUV420) { 
// Converting YUV_420_888 data to YUV_420_SP (NV21). 
byte[] data; 
ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer(); 
ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer(); 
int buffer0_size = buffer0.remaining(); 
int buffer2_size = buffer2.remaining(); 
data = new byte[buffer0_size + buffer2_size]; 
buffer0.get(data, 0, buffer0_size); 
buffer2.get(data, buffer0_size, buffer2_size); 
return data;} 

結果をビットマップに変換することができます:

Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
関連する問題