捕获 Android 深度相机流 (DEPTH16) 作为 OpenGL ES 纹理

Capturing Android depth camera stream (DEPTH16) as an OpenGL ES texture

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

Each pixel is 16 bits, representing a depth ranging measurement from a depth camera or similar sensor. The 16-bit sample consists of a confidence value and the actual ranging measurement.

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

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

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

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

幸运的是,深度图往往是 low-resolution(例如约 320x240),因此这可能不是一个大的性能问题。

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