얼마전에 안드로이드에 입문한 초보개발자 입니다.
카메라의 영상을 입력받아서 실시간으로 이진화하거나 처리한다음 다시
화면에 뿌려주는 것을 만들고 싶은데, 아직 매 프레임 영상을 비트맵으로
만드는 것도 못하고 있습니다.
조그만 도움이라도 주시면 감사하겠습니다.
샘플소스좀 봐야 감을 잡을 것 같은데,,
고수님들 좋은 정보나 조언좀 부탁드리겠습니다. 아래는 제가 만들다 만 소스입니다.
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;
}
});
}
}
이렇게만 보여주면 어느곳에 에러나는지 알수가 없어요 @.@ Log 를 찍어서 어느 부분에서 에러인지 알아야 문제점을 알수 있을거 같아요. 저도 비슷한 소스를 짜고 있는데 잘 안보이네요 ;