22

画面に表示せずに生の画像で画像処理を行いたいのですが、明らかにパフォーマンスが低下します。

このスレッドへの回答によると、プレビューなしでカメラから写真を撮ることは Android 1.5 では不可能でしたが、Android 4 (API レベル 15) で可能かどうかは誰にもわかりませんか?

4

3 に答える 3

47

Android 4 で生の画像データを画面に表示せずに受け取る最も簡単な方法は、Camera.setPreviewTexture()呼び出しを使用してプレビュー フレームを GPU にルーティングすることです。

これは、次の 2 つの方法で使用できます。

  1. GPU で実際の処理を行います。OpenGL コンテキストを設定し ( OpenGL ES 2 チュートリアル)、そのコンテキストでSurfaceTextureオブジェクトを作成します。次に、そのオブジェクトを setPreviewTexture に渡し、プレビューを開始します。次に、OpenGL コードで SurfaceTexture.updateTexImage を呼び出すと、SurfaceTexture に関連付けられたテクスチャ ID がカメラからの最新のプレビュー フレームに更新されます。必要に応じて、glReadPixels を使用してさらに処理するために、RGB テクスチャ データを CPU に読み戻すこともできます。
  2. CPU で処理を行います。OpenGL コンテキストをセットアップせずに、ダミーの SurfaceTexture オブジェクトを簡単に作成できます。テクスチャ ID として任意の整数を渡し、setPreviewTexture を使用して SurfaceTexture をカメラに接続します。updateTexImage を呼び出さない限り、SurfaceTexture はカメラから渡されたすべてのデータを単純に破棄します。次に、 setPreviewCallbackを使用してプレビュー コールバックを設定し、そのデータ (通常は YUV 形式) を CPU 処理に使用します。これはおそらく #1 よりも効率的ではありませんが、OpenGL の知識は必要ありません。
于 2012-05-27T18:41:50.177 に答える
1

コメントできないので。エディの答えについて。Java インターフェイスを使用するとパフォーマンス上の利点がなくなるため、NDK でこれを使用する必要があります。PixelBuffer を使用する必要があることは、パフォーマンスの観点からはまったく正気ではありません。RGBA888 から YUV への変換も C で行う必要があります。

TextureView をそのまま使用しないでください。さらに悪化します。YUVに変換する前に、ピクセルをビットマップにコピーしてから、ビットマップから配列にコピーする必要があります。これだけで、新しい Nexus 7 2013 にまたがるブランドの CPU 使用率のほぼ 30% を占めます。

最も効率的な方法は、Camera.h と直接やり取りして、すべての Android API をバイパスすることです。独自のバッファを作成し、YUV データが他の場所に移動する前にインターセプトできます。

于 2013-09-30T15:15:59.457 に答える