2011-04-28 7 views
1

これは初めてのAndroidプログラミングであり、Javaプログラミングに精通していません。私はインターネット上で私の問題についていくつかの答えを見つけようとしましたが、解決策は見つかりませんでした。あなたのうちの一人が私を助けてくれることを願っています。 私がやりたいことは、リアルタイムでビデオカメラに画像処理を適用して表示することです。そのため、結果を表示する前に、いくつかの画像処理を行うonPreviewFrame関数を使用しています。それが最善の方法でないか教えてください。私の問題は、私がデータ配列を変更しようとすると、画面上で何も変わらないということです。デバッガで見たものから関数が呼び出されます。そのすべては2.1 APIで行われます。onPreviewFrameはデータを変更しません

なぜ誰かが知っていますか?どうすればこの問題を解決できますか?

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import java.io.IOException; 

// ---------------------------------------------------------------------- 

public class CameraPreview extends Activity {  
    private Preview mPreview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Hide the window title. 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new Preview(this); 
     setContentView(mPreview); 
    } 

} 

// ---------------------------------------------------------------------- 

class Preview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback { 
    SurfaceHolder mHolder; 
    Camera mCamera; 

    Preview(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 

     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder);  
      mCamera.setPreviewCallback(this); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 


    public void onPreviewFrame(byte[] data, Camera camera) { 
     if (data != null) { 
      for(int i=0;i<data.length;i++){ 
       data[i] = 0; 
      } 
     } 

    } 


    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 

} 

は、 モルガン・コーミア

答えて

2

ちょっとそこ助けてくれてありがとう:

支援するため

は、ここに私のコードです! onPreviewFrameに渡されるバッファ(byte []データ)は、カメラフレームバッファのコピーです。そのため、カメラのプレビューが描画されたときに変更が反映されることはありません。

私はAndroidデベロッパーを始めたばかりですが、AFAIKはバッファを取り出してに描画します。 SurfaceView、 OpenGLサーフェスに変換します。私はこのことを実証しなければならないサンプルつかんできた。その例に続き

http://nhenze.net/?p=154

を、あなたは、あなたのイメージデータを取り、それをレンダリングするいくつかの処理を実行することができます。 GLのピクセルシェーダーを使っていつでも画像処理を行うことができます(AFAIK - Androidでこれを自分で試みたことはありません)。

希望に役立ちます!

2

私の場合は、SurfaceChangedのメソッドでPreviewCallbackをインストールした場合にのみ動作します

関連する問題