【问题标题】:Capturing Android depth camera stream (DEPTH16) as an OpenGL ES texture将 Android 深度相机流 (DEPTH16) 捕获为 OpenGL ES 纹理
【发布时间】:2020-09-24 15:47:47
【问题描述】:

我的目标是将 Android 深度相机流 (DEPTH16) 读取为 OpenGL ES 纹理,以便我可以在着色器中对其进行处理。正如documentation 所述,采用 DEPTH16 格式

每个像素是 16 位,代表从一个深度测距测量 深度相机或类似传感器。 16位样本由一个 置信度值和实际测距。

因此,在 OpenGL 着色器中,我尝试提取深度范围值并创建可以显示在屏幕上的灰度预览。

我正在使用 camera2 API。对于我使用SurfaceTexture 的常规RGB 相机流,从它创建一个Surface 并将其添加为相机捕获会话的目标。在这里,着色器使用samplerExternalOES 采样器类型访问纹理。但是,如果我理解正确的话,这一切只适用于 8 位 3 通道彩色图像,而在 DEPTH16 中,每个像素只代表一个 16 位值。

是否有其他一些 OpenGL 纹理可用于捕获 DEPTH16,它在着色器中的类型是什么? 我是 OpenGL 的新手,任何 cmets/建议都将不胜感激。

【问题讨论】:

    标签: android opengl-es android-camera2


    【解决方案1】:

    没有像 SurfaceTexture 这样的直接支持;您需要使用 ImageReader 并手动将深度信息从 ImageReader Image 复制到 OpenGL 纹理中,每一帧。您可能还需要在此阶段分离出置信度值和深度估计值(尽管原则上您可以在着色器中这样做,但必须小心转换)。

    幸运的是,深度图往往分辨率较低(例如~320x240),所以这可能不是一个大的性能问题。

    对于实际的 EGL 纹理,理想情况下,您需要一个可以存储至少 13 位深度信息的单通道纹理(如果您想包含 DEPTH16 格式中包含的置信度值,则为双通道)。实际上,这意味着 16 位整数或浮点数。

    【讨论】:

    • 谢谢!我尝试了您建议的第一种方法,在 ImageReader 中分离深度范围和置信度值,并将常规 8 位图像传递给 OpenGL(通过使用 GLUtils.texImage2D)。这很好用!但是您能否详细说明如何将 DEPTH16 直接复制到 OpenGL 纹理中并在着色器中进行分离?有没有可以替代texImage2D 的替代方法,也许可以用于自定义缓冲区?
    • 我主要是在大声思考;您需要在着色器代码中读取整数值,我不确定这是否真的可行。当然,您需要使用 khronos.org/registry/OpenGL-Refpages/es3.0/html/… 来获得无插值/过滤。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多