カメラ画像に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();
    }
}
inserted by FC2 system