我们知道华为AREngine可以根据接口acquireDepthImage()获取得到深度图,获取得到的深度图是DEPTH16格式的,AREngine中又没有给出例子怎样根据深度图求得深度信息,吐槽一下文档不够详细。

Image

acquireDepthImage()

在camera状态为tracking状态下,获取当前帧对应的深度图像,返回图像格式为DEPTH16,只能在下一次ARSession.update()前使用。

DEPTH16格式是Android dense depth image format.

每个像素是16位,代表深度摄像机或类似传感器的深度范围测量。16位样本由置信度值和实际测距测量组成。

置信度值是对样本正确性的估计。它编码在样本的3个最高有效位中,值0表示100%置信度,值1表示0%置信度,值2表示1/7,值3表示2/7,依此类推。

当由照相机拍摄时,射程的单位是毫米。

例如,以下示例从DEPTH16格式图像的第一个像素中提取范围和置信度,并将置信度转换为介于0和1.f之间的浮点值,其中1.f表示最大置信度:

    ShortBuffer shortDepthBuffer = img.getPlanes()[0].getBuffer().asShortBuffer();short depthSample = shortDepthBuffer.get()short depthRange = (short) (depthSample & 0x1FFF);short depthConfidence = (short) ((depthSample >> 13) & 0x7);float depthPercentage = depthConfidence == 0 ? 1.f : (depthConfidence - 1) / 7.f;

好了,我们已经知道DEPTH16格式的含义,那我们怎样在opengl中以纹理的方式在片元着色器里面求得相机坐标下的深度呢?

1、创建纹理ID,并且纹理可以传入无符号整型,这一定要注意GL_TEXTURE_MIN_FILTER与GL_TEXTURE_MAG_FILTER一定不要使用GL_NEAREST,否则整型数字传入不到纹理。

    public void createOnGlThread() {int[] textureId = new int[1];glGenTextures(1, textureId, 0);depthTextureId = textureId[0];glBindTexture(GL_TEXTURE_2D, depthTextureId);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);}

2、每次更新纹理,因为我们获取的是16位的,所以glTexImage2D第三个参数使用GL_R16UI, 第7个参数使用GL_RED_INTEGER,第8个参数使用GL_UNSIGNED_SHORT,参数不要使用错,否则很容易纹理写入不了数据。

    public void update(final ARFrame frame) {try {Image depthImage = frame.acquireDepthImage();depthTextureWidth = depthImage.getWidth();depthTextureHeight = depthImage.getHeight();
//            String msg = String.format("width: %s, height: %s", depthTextureWidth, depthTextureHeight);
//            Log.d("render", msg);glBindTexture(GL_TEXTURE_2D, depthTextureId);glTexImage2D(GL_TEXTURE_2D,0,GL_R16UI,depthTextureWidth,depthTextureHeight,0,GL_RED_INTEGER,GL_UNSIGNED_SHORT,depthImage.getPlanes()[0].getBuffer().asShortBuffer());depthImage.close();} catch (Exception e) {Log.d(TAG, "XXXXXXXXXXXX" + e);// This normally means that depth data is not available yet.}}

3、数据传入到纹理中了,看看shader中怎样处理纹理,获取相机坐标下的深度,单位是毫米。这一定注意,我们使用usampler2D类型接收纹理。

precision highp usampler2D;
layout (binding=2) uniform usampler2D bgDepthTexture;float GetBgDepthMillimeters(in vec2 depth_uv) {uvec3 rawDepth = texture(bgDepthTexture, depth_uv).xyz;int depthRange = int(rawDepth.r) & 0x1FFF;int depthConfidence = ((int(rawDepth.r) >> 13) & 0x7);float depthPercentage = depthConfidence == 0 ? 1.0 : float(depthConfidence - 1) / 7.0;float depth = depthPercentage > 0.1 ? float(depthRange) : FAR * 1000.0;depth = max(depth, NEAR * 1000.0);depth = min(depth, FAR * 1000.0);return depth;
}

这样就获得了相机坐标下的深度信息。

参考文档:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References-V5/frame-0000001050121447-V5

https://developer.android.com/reference/android/graphics/ImageFormat#DEPTH16

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

华为AREngine根据深度图获取深度信息相关推荐

  1. Kinect获取深度图和深度数据

    做关于深度信息处理的,正好实验室配备了kinect2代,就想着先用kinect获取深度信息来处理,之后换其他设备只要有深度信息就直接往后推进就行,不过网上教程虽然多,但是第一次总会栽进坑中,记录一波, ...

  2. matlab实现获取tof,一种结合TOF技术和双目视觉的深度信息获取装置及其方法与流程...

    本发明涉及深度传感器.机器视觉.三维重建.双目立体视觉.TOF技术领域,尤其涉及一种结合TOF技术和双目视觉的深度信息获取装置及其方法. 背景技术: 近年来,深度信息在传感器中获得了越来越多的应用.获 ...

  3. OpenGL:关于获取渲染结果的深度信息的问题(二)

    前面记录了一下存在的问题和大致的解决方法 OpenGL:关于获取渲染结果的深度信息的问题_六月的翅膀的博客-CSDN博客 下面就验证一下 先定义一个指针变量和一个成员函数 GLfloat* depth ...

  4. 利用摄像机如何获取物体的深度信息

    简而言之,其原理就是使用两个平行的相机,对空间中的每个点三角定位.通过匹配左右两个相机中成像点的位置,来计算对应三维点在空间中的距离.学术界对双目匹配恢复深度图研究有很长的历史,在NASA火星车上就开 ...

  5. OpenGL:关于获取渲染结果的深度信息的问题

    前面已经记录了从显存中获取渲染结果并保存为图像的方法 OpenGL:如何从缓存中读取颜色.深度信息[转]_六月的翅膀的博客-CSDN博客 并已经验证了上述方法可以完美的保存图像,但是保存深度信息部分还 ...

  6. 下载华为交换机 MIB 参考文件并使用 snmpwalk 获取 OID 信息

    这里填写标题 1. 下载华为交换机 MIB 参考文件并使用 snmpwalk 获取 OID 信息 1. 下载华为交换机 MIB 参考文件并使用 snmpwalk 获取 OID 信息 下载交换机 MIB ...

  7. 【HMS Core】华为登录后返回错误码 8 、账号服务如何授权、推送服务端获取用户信息异常

    1.[HMS core][游戏登陆][问题描述] 调用华为登录后返回错误码 8 [解决方案] 错误码8的话一般在定义为内部错误(引起该错误码的原因很多),但是一般重试基本可以解决该问题(错误码).如果 ...

  8. Kinect Azure DK获取深度图、深度数据和人体骨骼关键点三维坐标

    使用环境:Azure Kinect SDK v1.4.1 + Azure Kinect Body Tracking SDK 1.0.1 + VS2019 + Opencv 文章目录 一.获取深度图 二 ...

  9. 卷积神经网络CNN是靠什么线索学习到深度信息的?

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :量子位,王乃岩知乎 [人工 ...

最新文章

  1. nginx或httpd实现负载均衡tomcat(三)
  2. 打造LINUX系统安全(早期学习笔记)
  3. (Oracle)DDL及其数据泵导入导出(impdp/expdp)
  4. 安装CentOS6.8并配置网络图文解说亲测全过程
  5. Linux下netstat常用,Linux netstat常用命令
  6. idea 启动tomcat 工程_如何在IDEA中创建web项目并且部署到Tomcat中
  7. windows api 每日一练(5)基本内存操作
  8. busybox inetd tftpd
  9. Siemens M65...
  10. Ubuntu更新下载源
  11. 将数组分成两部分使得两部分的和的差最小
  12. 基于Java SpringBoot的电影院管理系统设计与实现毕业设计源码011633
  13. i微信编辑器服务器,i排版微信编辑器
  14. V$LOGMNR_CONTENTS字段含义
  15. linux免安装mysql_linux上免安装版MySQL5.7.18的教程详解
  16. 描述汇集天地之灵气的上道下器
  17. NDCG评价指标讲解
  18. Access denied for user ''@'localhost' to database 'mysql' 解决办法
  19. 东方博宜OJ 1043 - 【入门】行李托运价格
  20. 如何用python编写抢购程序源码_Python实现淘宝秒杀聚划算抢购自动提醒源码

热门文章

  1. 移动端图片预览插件-fly-zomm-img.min.js
  2. FIN_WAIT_2状态解释
  3. python几行代码实现邮件解析
  4. 微信小程序Demo组件大全(对话框、指示器、五星评分,画廊,影院座位……
  5. jQuery入门案例
  6. Redis是什么?有什么用?
  7. Harris角点特征提取和角点特征匹配(2)
  8. java反编译工具真的很强大!
  9. python音频 降噪_从视频中提取音频数据,然后应用傅里叶对音频降噪(python)...
  10. 使用JMETER进行REST API测试(分步指南)