华为AREngine根据深度图获取深度信息
我们知道华为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根据深度图获取深度信息相关推荐
- Kinect获取深度图和深度数据
做关于深度信息处理的,正好实验室配备了kinect2代,就想着先用kinect获取深度信息来处理,之后换其他设备只要有深度信息就直接往后推进就行,不过网上教程虽然多,但是第一次总会栽进坑中,记录一波, ...
- matlab实现获取tof,一种结合TOF技术和双目视觉的深度信息获取装置及其方法与流程...
本发明涉及深度传感器.机器视觉.三维重建.双目立体视觉.TOF技术领域,尤其涉及一种结合TOF技术和双目视觉的深度信息获取装置及其方法. 背景技术: 近年来,深度信息在传感器中获得了越来越多的应用.获 ...
- OpenGL:关于获取渲染结果的深度信息的问题(二)
前面记录了一下存在的问题和大致的解决方法 OpenGL:关于获取渲染结果的深度信息的问题_六月的翅膀的博客-CSDN博客 下面就验证一下 先定义一个指针变量和一个成员函数 GLfloat* depth ...
- 利用摄像机如何获取物体的深度信息
简而言之,其原理就是使用两个平行的相机,对空间中的每个点三角定位.通过匹配左右两个相机中成像点的位置,来计算对应三维点在空间中的距离.学术界对双目匹配恢复深度图研究有很长的历史,在NASA火星车上就开 ...
- OpenGL:关于获取渲染结果的深度信息的问题
前面已经记录了从显存中获取渲染结果并保存为图像的方法 OpenGL:如何从缓存中读取颜色.深度信息[转]_六月的翅膀的博客-CSDN博客 并已经验证了上述方法可以完美的保存图像,但是保存深度信息部分还 ...
- 下载华为交换机 MIB 参考文件并使用 snmpwalk 获取 OID 信息
这里填写标题 1. 下载华为交换机 MIB 参考文件并使用 snmpwalk 获取 OID 信息 1. 下载华为交换机 MIB 参考文件并使用 snmpwalk 获取 OID 信息 下载交换机 MIB ...
- 【HMS Core】华为登录后返回错误码 8 、账号服务如何授权、推送服务端获取用户信息异常
1.[HMS core][游戏登陆][问题描述] 调用华为登录后返回错误码 8 [解决方案] 错误码8的话一般在定义为内部错误(引起该错误码的原因很多),但是一般重试基本可以解决该问题(错误码).如果 ...
- Kinect Azure DK获取深度图、深度数据和人体骨骼关键点三维坐标
使用环境:Azure Kinect SDK v1.4.1 + Azure Kinect Body Tracking SDK 1.0.1 + VS2019 + Opencv 文章目录 一.获取深度图 二 ...
- 卷积神经网络CNN是靠什么线索学习到深度信息的?
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟 报道 | 公众号 CVLianMeng 转载于 :量子位,王乃岩知乎 [人工 ...
最新文章
- nginx或httpd实现负载均衡tomcat(三)
- 打造LINUX系统安全(早期学习笔记)
- (Oracle)DDL及其数据泵导入导出(impdp/expdp)
- 安装CentOS6.8并配置网络图文解说亲测全过程
- Linux下netstat常用,Linux netstat常用命令
- idea 启动tomcat 工程_如何在IDEA中创建web项目并且部署到Tomcat中
- windows api 每日一练(5)基本内存操作
- busybox inetd tftpd
- Siemens M65...
- Ubuntu更新下载源
- 将数组分成两部分使得两部分的和的差最小
- 基于Java SpringBoot的电影院管理系统设计与实现毕业设计源码011633
- i微信编辑器服务器,i排版微信编辑器
- V$LOGMNR_CONTENTS字段含义
- linux免安装mysql_linux上免安装版MySQL5.7.18的教程详解
- 描述汇集天地之灵气的上道下器
- NDCG评价指标讲解
- Access denied for user ''@'localhost' to database 'mysql' 解决办法
- 东方博宜OJ 1043 - 【入门】行李托运价格
- 如何用python编写抢购程序源码_Python实现淘宝秒杀聚划算抢购自动提醒源码