【问题标题】:Modify and update camera frame via GLSurfaceView通过 GLSurfaceView 修改和更新相机帧
【发布时间】:2015-07-11 16:07:35
【问题描述】:

我正在使用 GLSurfaceView 活动在 Android 设备上显示相机框架。由于我是OpenGl Es 的新手,我想知道如何获取图像缓冲区并对其进行修改,然后在手机上显示修改后的帧?

在实现 GLSurfaceView.Renderer 的 Renderer 类中,我调用了本机函数:

public class Renderer implements GLSurfaceView.Renderer {
  public void onDrawFrame(GL10 gl) {
    MyJNINative.render();
  }
...
}

我正在使用的API 提供了一个connectCallBack 方法,可以通过onFrameAvailableNow 之类的方式访问图像缓冲区。 所以我已经有了const 类型的图像缓冲区。所以我对它的修改不会得到反映。

现在我的问题是如何添加一些gl方法来修改可以反映在显示器上的图像缓冲区?

我的原生渲染器:

Java_com_project_MyJNINative_render(
        JNIEnv*, jobject) {
    // Let's say I have image buffer here called "uint_8t* buffer"
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glViewport(0, 0, width, height);

    // UpdateTexture() 
    api_handler.UpdateTexture());
    gl_vid_obj->Render(glm::mat4(1.0f), glm::mat4(1.0f));    
    /// I NEED SOME CODE HERE TO set gl buffer
}

【问题讨论】:

  • 相机输出发送到哪里?您一次只能将一个生产者附加到 Surface,因此您可以将相机输出发送到那里,也可以发送 GLES 渲染。您是否在 SurfaceTexture 上接收相机输出?你打算做什么样的修改?
  • @fadden 渲染相机输出以显示。是的,我正在gl 表面纹理上接收相机输出。我需要更改当前帧中的一些随机像素。
  • 相机图像处于“外部”纹理中。你可以用它做大多数其他 GLES 纹理的事情。从 C++ 或 Java 编辑纹理并不简单。渲染纹理然后在其上绘制要容易得多。我仍然不知道您要做什么,但是如果您想要比绘制更复杂的东西,也许过滤就是您想要的?此处示例:youtube.com/watch?v=kH9kCP2T5Gg
  • @fadden 是的,过滤和图像处理的东西正是我需要的。通过查看yTube 链接中的代码,我得出结论,这并不是那么简单。但是,我想知道这可能会更容易,因为我已经捕获了原始帧缓冲区。我还需要的是更新GLSurfaceView
  • Grafika 演示是使用 GLES 片段着色器应用卷积过滤器的一个相当简单的示例。如果您想在 GPU 上完成工作,您可以做类似的事情,或者将相机输出提供给 Renderscript 并以这种方式完成工作 (developer.android.com/guide/topics/renderscript/compute.html)。您无法通过 FBO 访问相机帧,因为它是“外部”纹理。

标签: android opengl-es android-camera glsurfaceview


【解决方案1】:

正如fadden 解释的那样,您无法更改连接到 SurfaceTexture 的预览缓冲区。但是您可以使用onPreviewFrame() 获取预览缓冲区,对其进行修改并通过glTexSubImage2D() 将结果推送到OpenGL。有两个陷阱:您应该隐藏实际预览(可能将其连接到在您的 GL 表面上不可见的纹理),并且您应该足够快地完成所有处理(至少 20 FPS 以使“预览”看起来自然)。

【讨论】:

  • 是的,显然这是目前唯一简单的解决方案。但是我的处理不应该阻止 glTexImage2D,不是吗?
  • 一般来说,你在 OpenGL 线程上渲染,这是你不应该阻塞的地方(当然也不应该在 UI 线程上)。但是您的处理可能需要一些时间 - 结果将是相机位置和预览之间的“滞后”。
猜你喜欢
  • 2012-11-27
  • 2012-10-23
  • 2016-10-16
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2012-04-13
相关资源
最近更新 更多