Есть ли лучший способ получить пиксели камеры, чем onPreviewFrame на Android? - PullRequest
3 голосов
/ 16 января 2012

onPreviewFrame вызывается только тогда, когда отображаются кадры предварительного просмотра с камеры.Я обрабатываю изображение как текстуру open gl, используя ту же технику:

http://nhenze.net/?p=172&cpage=1#comment-8424

Но кажется ненужным рендерить предварительный просмотр на экран, чтобы я мог рисоватьповерх этого с моим текстурированным изображением.Есть ли лучший способ получить пиксели с камеры, чем во время вызова onPreviewFrame?

1 Ответ

4 голосов
/ 06 февраля 2012

Да, вы можете использовать SurfaceTexture. Здесь есть небольшая хитрость, так как это должна быть внешняя текстура , а не нормальная 2D текстура.

Это означает, что если вы рендерите текстуру с ES2, вам понадобится что-то вроде

#extension GL_OES_EGL_image_external : require
uniform samplerExternalOES s_texture;

во фрагментном шейдере.

Пример кода:

    int[] textures = new int[1];
    // generate one texture pointer and bind it as an external texture.
    GLES20.glGenTextures(1, textures, 0);
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);
    // No mip-mapping with camera source.
    GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_MIN_FILTER,
                            GL10.GL_LINEAR);        
    GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    // Clamp to edge is only option.
    GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
            GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);


    int texture_id = textures[0];
    SurfaceTexture mTexture = new SurfaceTexture(texture_id);
    mTexture.setOnFrameAvailableListener(this);

    Camera cam = Camera.open();
    cam.setPreviewTexture(mTexture);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...