同步摄像头预览和处理

Ame*_*een 10 android opengl-es

我正在设计一个具有OpenGL处理​​管道(着色器集合)的应用程序,同时要求最终用户查看未处理的相机预览.

例如,假设您要向用户显示摄像机预览,同时计算从摄像机接收的场景中的红色对象的数量,但是您使用任何着色器来计算对象(如色调过滤),用户不应该看到等.

我该如何正确设置?

我知道我可以设置摄像头预览,然后在回调上接收YUV格式的摄像机帧数据,然后将其转储到OpenGL纹理中并以这种方式处理帧,但是,它具有与之相关的性能问题.我必须将数据从摄像头硬件往返到VM,然后将其传递回GPU内存.我正在使用SurfaceTextureOpenGL以可理解的格式直接从相机获取数据,并将其传递给我的着色器以解决此问题.

我以为我能够向SurfaceTexture最终用户显示相同的未经处理,但TextureView没有构造函数或setter,我可以传递它,SurfaceTexture我希望它呈现.它总是创造自己的.

这是我当前设置的概述:

  • GLRenderThread:此类从Thread扩展,设置OpenGL上下文,显示等,并使用SurfaceTexture作为表面(eglCreateWindowSurface的第3个参数).
  • GLFilterChain:对输入纹理执行检测的着色器集合.
  • 相机:使用单独的SurfaceTexture作为GLFilterChain的输入并抓取相机的预览
  • 最后是一个显示GLRenderThread的SurfaceTexture的TextureView

显然,通过这种设置,我向用户显示处理过的帧,这不是我想要的.此外,帧的处理不是实时的.基本上,我从Camera通过链运行输入一次,所有过滤器完成后,我调用updateTexImage从相机抓取下一帧.我在Nexus 4上的处理速度约为每秒10帧.

我觉得我可能需要使用2个GL上下文,一个用于实时预览,一个用于处理,但我不确定.我希望有人能把我推向正确的方向.

tri*_*out 0

您可以上传一些您正在使用的代码吗?

您也许可以在为最初用于显示预览的表面视图创建并绑定到的纹理上调用 glDrawArrays,然后刷新它并将单独的纹理与其他纹理绑定以进行分析?就像是

GLES20.glUseProgram(simpleProgram);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

GLES20.glUseProgram(crazyProgram);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[1]);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
Run Code Online (Sandbox Code Playgroud)

其中相机的预览表面纹理绑定到纹理[0],然后为纹理[1]创建单独的表面纹理

或许?