如何解决将Android深度相机流DEPTH16捕获为OpenGL ES纹理
我的目标是将Android深度相机流(DEPTH16)作为OpenGL ES纹理读取,以便可以在着色器中对其进行处理。如documentation所述,以DEPTH16格式
每个像素为16位,表示从 深度相机或类似的传感器。 16位样本包括 置信度值和实际测距测量。
因此,我正在OpenGL着色器中尝试提取深度范围值并创建可以在屏幕上显示的灰度预览。
我正在使用camera2 API。对于常规的RGB相机流,我使用SurfaceTexture
,从中创建一个Surface
并将其添加为相机捕获会话的目标。在这里,着色器通过使用samplerExternalOES
采样器类型来访问纹理。但是,如果我理解正确,那么所有这些仅适用于8位3通道彩色图像,而在DEPTH16中,每个像素仅代表一个16位值。
还有其他一些我可以用来捕获DEPTH16的OpenGL纹理吗?它在着色器中的类型是什么? 我是OpenGL的新手,任何评论/建议都将不胜感激。
解决方法
没有像SurfaceTexture这样的直接支持;您需要使用ImageReader,然后将ImageReader图像的每一帧的深度信息手动复制到OpenGL纹理中。在这一阶段,您可能还需要分离出置信度值和深度估计值(尽管原则上可以在着色器中做到这一点,只需要注意转换)。
幸运的是,深度图往往是低分辨率的(例如〜320x240),因此这可能不是很大的性能问题。
对于实际的EGL纹理,理想情况下,您需要一个单通道纹理(如果要包括DEPTH16格式的置信度值,则为两个通道),该纹理可以存储至少13位深度信息。实际上,这意味着16位整数或浮点数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。