ToF相机从Camera2 API中获取DEPTH16格式深度图[通俗易懂]

ToF相机从Camera2 API中获取DEPTH16格式深度图[通俗易懂]ToF相机工作原理:ToF相机给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲往回的飞行时间来得到目标距离。ToF相机可以同时得到整幅图像的深度(距离)信息。  深度图通常是灰度图,其中的每个值代表光反射表面和相机的距离。灰度图水平垂直坐标对应像素点位置,该位置的灰度值对应的是该像素距离摄像头的距离。所以深度图中的每个像素可以表示空间中一个点的三维坐标。如果光源被吸收或者未收到反射信号则呈现黑色。从Camera2API中获取DEPTH16格式的深度信息ImageFormat.DE

大家好,又见面了,我是你们的朋友全栈君。

ToF相机工作原理:

ToF相机给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲往回的飞行时间来得到目标距离。ToF相机可以同时得到整幅图像的深度(距离)信息。
  深度图通常是灰度图,其中的每个值代表光反射表面和相机的距离。灰度图水平垂直坐标对应像素点位置,该位置的灰度值对应的是该像素距离摄像头的距离。所以深度图中的每个像素可以表示空间中一个点的三维坐标。如果光源被吸收或者未收到反射信号则呈现黑色。

从Camera2API中获取DEPTH16格式的深度信息

ImageFormat.DEPTH16: Android密集深度图像格式。每个深度值是16位。16位由置信度值和实际测距测量组成。置信度是该样本正确性的估计值。它被编码在样本的3个最高效有效位中,其值0表示100%置信度,值1表示0%置信度,值2表示1/7,值3表示2/7. 剩下的13位就是表示每个像素的深度值。
获取深度信息流程:打开深度ToF相机—->给ImageReader设置长宽和格式ImageFormat.DEPTH16。在回调接口onImageAvailabe中拿到image数据。

  private int[] getDepth(Image image){
          ShortBuffer shortDepthBuffer=image.gePlanes()[0].getBuffer().asShortBuffer();
          int[] arr=new int[WIDTH*HEIGHT];
          for(int y=0;y<HEIGHT;y++){
               for(int x=0;x<WIDTH;x++){
                  int index=y*WIDTH+x;
                  short depth=shortDepthBuffer.get(indxe);
                  int newValue=extractRange(depthSample,0.1);
                  arr[index]=newVaule;
                  }
                }
           }

private int extractRange(short sample,float confidenceFilter){
     //2字节后13位保存深度信息
      int depthRange=(short)(sample&0x1FFF);
      //2字节的前3位保存置信度值
      int depthConfidence=(short)((sample>>13) & 0x7);
      //其值0表示100%置信度,值1表示0%置信度,值2表示1/7,值3表示2/7.
      //转换成我们熟悉点的表示方式 0~~1
      float depthPercentage=depthConfidence==0?1.f:(depthConfidence-1)/7.f;
      return depthPercentage>confidenceFilter?depthRange:0;
      }

获取到的距离信息归一化位0~255的像素值,最后转为RGB Bitmap,然后显示出来,基本可以看到物体的轮廓。

写在最后的话

今天是五一,放假,有时间可以写写博客,刚好可以对自己学习的东西有个整理~~~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142697.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java switch基础介绍及具体使用方法

    java switch基础介绍及具体使用方法switch的case语句可以处理int,short,byte,char类型的值,但是不能处理long,String等类型。javaswitch基础语法witch(表达式){case表达式常量1:语句1;break;case表达式常量2:语句2;break;……case表达式常量n:语句n;break;[default:语句n+1;]…

  • Ubuntu 20.04 CUDA&cuDNN安装方法[通俗易懂]

    Ubuntu 20.04 CUDA&cuDNN安装方法[通俗易懂]下载cuda输入nvidia-smi命令查看支持的cuda版本如果无法查看,则说明尚未安装nvidia驱动,点击附加驱动,选择对应版本的驱动即可自动下载。从https://developer.nvidia.com/cuda-toolkit-archive下载对应版本的cuda,选择18.04的版本即可。gcc降级Ubuntu20.04自带的gcc版本为9.7….

  • jetson tx1 配置SSD固态硬盘「建议收藏」

    jetson tx1 配置SSD固态硬盘「建议收藏」转载自:http://blog.csdn.net/hit2015spring/article/details/62217289配置外置SSD这里用的是三星EVO250G的SSD,支持SATA接口,ssd插上去开机是不能用的,TX1是没有识别的,需要的格式化为Linux支持的文件系统ext4.一系列配置之后可以把ssd设置为外置的存储,然后再把文件系统拷贝到SSD

  • java高级工程师_一名Java高级工程师需要学什么?

    java高级工程师_一名Java高级工程师需要学什么?从两方面讨论一名java高级工程师需要学些什么,具备什么能力,感兴趣的小伙伴们可以参考一下宏观上:1.技术广度方面至少要精通多门开源技术吧,研究过struts\spring等的源码。2.项目经验方面从头到尾跟过几个大项目,头是指需求阶段,包括需求调研。尾是指上线交付之后,包括维护阶段。3.架构经验方面有过分布式系统的架构和开发经验。对于跨系统的结构优化,数据存储的性能指标等有丰富经验。什么缓存啊、…

  • JavaBean的作用「建议收藏」

    JavaBean的作用「建议收藏」javaBean 编辑JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,long和class方法获取。众所周知,属性名称符合这种模式,其他Java类可以通过自省机制发现和操作这些JavaBean的属性。javaBean在MVC设计…

  • 02_JavaScript学习笔记整理-BOM浏览器对象模型

    02_JavaScript学习笔记整理-BOM浏览器对象模型

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号