2015-09-22 37 views
5

新しいカメラ2 APIは古いものとは大きく異なります。操作されたカメラフレームをパイプラインのユーザー部分に表示すると、私は混乱します。私はCamera preview image data processing with Android L and Camera2 APIについての非常に良い説明があることを知っていますが、フレームを示すことはまだ明らかではありません。私の質問は、Camera2 APIパイプラインの効率とスピードを維持しながら、何らかの処理後にImageReadersコールバック関数から来た画面上のフレームを表示する方法は何ですか?処理されたプレビュー画像を表示するAndroid Camera2 API

例フロー:

camera.add_target(imagereader.getsurface) - >のImageReaderにいくつかの処理を行うコールバック - >(画面上の画像を処理したショー?)

回避策のアイデア:すべてのImageViewのにビットマップを送信します時間新しいフレームが処理される。

+1

すべてのプレビューフレームでこれを実行しようとしていますか、しばらくして(このような高解像度の静止キャプチャなど)レートと解像度に応じて、異なる表示アプローチがより適切かもしれません。 –

+0

実際にはすべてのフレーム。私は、画像処理による時間の損失のために表示することができないフレームがあることを知っています。YUVフォーマットは、プレビュー上のMI 30のFPSを与え、私ができる私は、画面上の20そのフレームを表示したい毎秒合計30の20個のフレームを処理することができる場合。 – rcmalli

答えて

11

質問を明確にした後に編集します。下の元の回答

あなたが処理している場所によって異なります。

SurfaceをSurfaceViewまたはTextureViewから割り当て(setSurface)に接続して、処理済み出力をその割り当てに書き込み、Allocation.ioSend()で送信することができます。 HDR Viewfinder demoはこのアプローチを使用します。

EGLシェーダベースの処理を行っている場合は、Surfaceをnative_window引数としてeglCreateWindowSurfaceでサーフェスをEGLSサーフェスに接続できます。その後、最終出力をそのEGLSurfaceにレンダリングすることができ、eglSwapBuffersを呼び出すと、バッファが画面に送られます。

ネイティブ処理を行っている場合は、NDK ANativeWindow methodsを使用して、Javaから渡したSurfaceに書き込み、convertからANativeWindowに渡すことができます。

Javaレベルの処理を行っているなら、それは本当に遅く、おそらく望んでいないでしょう。しかし、新しいAndroid M ImageWriterクラスを使用するか、フレームごとにEGLにテクスチャをアップロードすることができます。

あなたが言うように、すべてのフレームでImageViewに描画しますが、それは遅くなります。


オリジナルの答え:

あなたはJPEGの画像をキャプチャしている場合、あなたは、単にbyte[]Image.getPlanes()[0].getBuffer()からのByteBufferの内容をコピーして、ビットマップに変換するBitmapFactory.decodeByteArrayを使用することができます。

YUV_420_888イメージをキャプチャする場合は、3平面YCbCr 4:2:0フォーマットから、RGB値のint []など、表示できるものに独自の変換コードを書き込む必要がありますからのビットマップ;残念ながら、これにはまだ便利なAPIはありません。

RAW_SENSOR画像(ベイヤーパターンの未処理センサーデータ)をキャプチャーする場合は、画像処理を大量に行うか、DNGを保存するだけです。

+0

私が質問に私はすでにとにかくデータ型が、感謝を変換する方法ではなく、画面上のフレームを読み込んで処理したことを示すためにどのように求めていることを述べたように。 – rcmalli

+0

質問がうまく一致するように更新された回答。 –

+0

非常によく説明されています。私はその答えは.Iは、冒頭に不明瞭な質問について申し訳ありません新しいAPIを使用する人々を導くだろうと仮定します。 – rcmalli

関連する問題