2011-10-23 8 views
0

私はカメラで画像処理技術をいくつか行うためにAndroidアプリを作成しています。これは、システム全体がどのように動作するかの擬似コードです:Androidの画像処理で画像データを素早く取得する

1. loop while not finished 
    1.1 get image frame 
    1.2 process image for object detection 
2. end loop 

私は実際にCameraクラスの基礎に質問がある:

  1. は速くありませんプレビューよりもカメラから知覚される画像をプレビューしています全く?前者は、SurfaceViewを使用して画像をプレビューすることを意味します。
  2. takePicture()メソッドから、プレビューなしで画像データ配列を取得できますか?

私の本当の問題は、画像を処理した後、迅速かつ反復的に画像データ(例えば、byte[]配列)を取得するための最良の方法は何である(上に述べたように)ですか?

私は画像データを取得する方法をtakePicture()にしようとしましたが、これが唯一の方法である場合や他の方法がある場合は、あなたの意見が必要です。

+1

おそらくプレビューをほとんど使用できます。 takePictureの呼び出しは完全なResでキャプチャし、コードが実際にそれを取得する前に処理に時間がかかります。いくつかのアプリは両方の組み合わせを使用します。 takePictureから得られたフレームのプレビューフレームと全体的に高価な計算を使って、すばやく処理します。 –

+0

どのようにプレビューフレームを取得しますか?簡単なコードスニペットが役に立ちます。 –

+0

aleph_nullとは何ですか:) –

答えて

2

SurfaceViewをカメラのプレビュー表示として設定し、PreviewCallbackを使用してすべてのプレビューフレームのデータを取得できます。これは、takePictureキャプチャの高解像度が必要ない場合は、takePictureを使用するよりも優れています。言い換えれば、より速いレートで低品質の画像をキャプチャしたい場合は、PreviewCallbackを使用します。非常に低速で高品質の画像をキャプチャする場合は、takePictureを使用します。

あなたの質問については、プレビュー表示を使わずに写真を撮ることはできませんが、間違っている可能性があります。

class MainActivity extends Activity implements Camera.PreviewCallback, SurfaceHolder.Callback { 
    ... 

    public void surfaceCreated(SurfaceHolder holder) { 
    camera = Camera.open(); 
    camera.setPreviewCallback(this); 
    ... 
    } 

    public void onPreviewFrame(byte[] data, Camera camera) { 
    // image data contained in data... do as you wish 
    } 
}