얼마전에 안드로이드에 입문한 초보개발자 입니다.
카메라의 영상을 입력받아서 실시간으로 이진화하거나 처리한다음 다시
화면에 뿌려주는 것을 만들고 싶은데, 아직 매 프레임 영상을 비트맵으로
만드는 것도 못하고 있습니다.
조그만 도움이라도 주시면 감사하겠습니다.
샘플소스좀 봐야 감을 잡을 것 같은데,,
고수님들 좋은 정보나 조언좀 부탁드리겠습니다. 아래는 제가 만들다 만 소스입니다.



public class CameraActivity extends Activity {
 private CameraPreview mPreview;
 
// private MyView mView;
// Camera camera;
 
 
   
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
  
        
        
        
        //초기카메라영상띄움//       
        mPreview = new CameraPreview(this);
        setContentView(mPreview);
        ((FrameLayout) findViewById(R.id.mPreview)).addView(mPreview);
      
       
    }
}


ackage com.android.camera;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.os.Bundle;
import android.util.Log;
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 {
    SurfaceHolder mHolder;
    Camera mCamera;

    Preview(Context context) {
        super(context);

        // SurfaceHolder.Callback을 설정함으로써 Surface가 생성/소멸되었음을
        // 알 수 있습니다.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mHolder.setFixedSize(320, 240);

    }

    public void surfaceCreated(SurfaceHolder holder) {
     // Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후 카메라의
     // Preview 를 표시할 위치를 설정합니다.
        mCamera = Camera.open();
        try {
           mCamera.setPreviewDisplay(holder);
        } catch (IOException exception) {
            mCamera.release();
            mCamera = null;
            // TODO: add more exception handling logic here
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
     // 다른 화면으로 돌아가면, Surface가 소멸됩니다. 따라서 카메라의 Preview도
     // 중지해야 합니다. 카메라는 공유할 수 있는 자원이 아니기에, 사용하지 않을
     // 경우 -액티비티가 일시정지 상태가 된 경우 등 - 자원을 반환해야합니다
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // 표시할 영역의 크기를 알았으므로 해당 크기로 Preview를 시작합니다.
       
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(320, 240);
        parameters.setPictureSize(320, 240);
        parameters.setPreviewFormat(PixelFormat.RGB_565);
     
        mCamera.setParameters(parameters);
      

        mCamera.startPreview();
        //holder.lockCanvas();
        mCamera.setPreviewCallback(new PreviewCallback() {
            public void onPreviewFrame(byte[] _data, Camera _camera) {  
             // TODO Do something with the preview image. 
              Log.i("bitmap1",_data.length+"");
             int abc[]=decodeYUV420SP(_data,320,240);
             
             
         
            }
           
            public int[] decodeYUV420SP( byte[] yuv420sp, int width, int height) {
             final int frameSize = width * height;

             int rgb[]=new int[width*height];
             for (int j = 0, yp = 0; j < height; j++) {
              int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
              for (int i = 0; i < width; i++, yp++) {
               int y = (0xff & ((int) yuv420sp[yp])) - 16;
               if (y < 0) y = 0;
               if ((i & 1) == 0) {
                v = (0xff & yuv420sp[uvp++]) - 128;
                u = (0xff & yuv420sp[uvp++]) - 128;
               }

               int y1192 = 1192 * y;
               int r = (y1192 + 1634 * v);
               int g = (y1192 - 833 * v - 400 * u);
               int b = (y1192 + 2066 * u);

               if (r < 0) r = 0; else if (r > 262143) r = 262143;
               if (g < 0) g = 0; else if (g > 262143) g = 262143;
               if (b < 0) b = 0; else if (b > 262143) b = 262143;

               rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) &
             0xff00) | ((b >> 10) & 0xff);


              }
             }
             return rgb;
             }


           
          });
    }

}