カメラ画像にOpenGLを重ねる
AR的な表現をしたい時には、 カメラのプレビュー画像にオーバーレイで画像を重ねたくなります。さらにARの場合は、単純にBitmapを重ねるよりOpenGLで動的に図形を描画する方が多いと思います。
以下、サンプルコードです。
・CameraActivity.java
package com.kenken0980.android.GLonCamera;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.WindowManager.LayoutParams;
public class CameraActivity extends Activity {
private CameraView cameraView;
private GLSurfaceView mGLSurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cameraView = new CameraView(this);
mGLSurfaceView = new GLSurfaceView(this);
mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
// ApiDemos のCubuRenderer を利用してます
mGLSurfaceView.setRenderer(new CubeRenderer(true));
mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
setContentView(mGLSurfaceView);
addContentView(cameraView,
new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
}
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mGLSurfaceView.onPause();
}
}
・CameraView.java
package com.kenken0980.android.GLonCamera;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraView extends SurfaceView
implements SurfaceHolder.Callback {
private SurfaceHolder surfaceHolder;
private Camera camera;
public CameraView(Context context) {
super(context);
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(holder);
} catch (Exception e) {
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
}