如何将 16 位深度图像保存到 Arcore(java)中的文件

Posted

技术标签:

【中文标题】如何将 16 位深度图像保存到 Arcore(java)中的文件【英文标题】:How to save 16bit depth Image to file in Arcore (java) 【发布时间】:2021-04-06 13:01:13 【问题描述】:

我想将arcore中的深度信息保存到存储中。 这是开发者指南中的示例。

  public int getMillimetersDepth(Image depthImage, int x, int y) 
  // The depth image has a single plane, which stores depth for each
  // pixel as 16-bit unsigned integers.
  Image.Plane plane = depthImage.getPlanes()[0];
  int byteIndex = x * plane.getPixelStride() + y * plane.getRowStride();
  ByteBuffer buffer = plane.getBuffer().order(ByteOrder.nativeOrder());
  short depthSample = buffer.getShort(byteIndex);
  return depthSample;

所以我想将此字节缓冲区保存到本地文件中,但我的输出 txt 文件不可读。我该如何解决这个问题? 这是我所拥有的

Image depthImage = frame.acquireDepthImage();
Image.Plane plane = depthImage.getPlanes()[0];
int format = depthImage.getFormat();
ByteBuffer buffer = plane.getBuffer().order(ByteOrder.nativeOrder());
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
File mypath=new File(super.getExternalFilesDir("depDir"),Long.toString(lastPointCloudTimestamp)+".txt");
FileChannel fc = new FileOutputStream(mypath).getChannel();
fc.write(buffer);
fc.close();
depthImage.close();

我试图用

解码它们
String s = new String(data, "UTF-8");
System.out.println(StandardCharsets.UTF-8.decode(buffer).toString());

但是输出还是这么奇怪

    .03579:<=>@ABCDFGHJKMNOPRQSUWY]_b

【问题讨论】:

【参考方案1】:

为了获取 ARCore 会话提供的深度数据,您需要将字节写入本地文件。 Buffer 对象是一个容器,它包含特定原始类型的元素的有限序列(此处为 ByteBuffer 的字节)。因此,您需要在文件中写入您的data 变量,该变量对应于先前存储在缓冲区中的信息(根据buffer.get(data))。

它对我来说很好用,我设法在 python 代码中绘制了提供的深度图(但以下代码背后的想法可以很容易地适应 java 代码):

depthData = np.fromfile('depthdata.txt', dtype = np.uint16) 
H = 120 
W = 160
def extractDepth(x):
    depthConfidence = (x >> 13) & 0x7 
    if (depthConfidence > 6): return 0 
    return x & 0x1FFF 
depthMap = np.array([extractDepth(x) for x in depthData]).reshape(H,W)
depthMap = cv.rotate(depthMap, cv.ROTATE_90_CLOCKWISE)

有关更多详细信息,请在此处阅读有关深度图 (DEPTH16) 格式的信息:https://developer.android.com/reference/android/graphics/ImageFormat#DEPTH16 您还必须注意,深度图分辨率设置为160x120 像素,并根据横向格式定向。

还要确保将您的代码用try/catch 代码块包围,以防出现IOException 错误。

【讨论】:

以上是关于如何将 16 位深度图像保存到 Arcore(java)中的文件的主要内容,如果未能解决你的问题,请参考以下文章

将图像转换为 16 位颜色深度 [重复]

ps转16位图少了字节

C++如何把位图保存到数组中

使用 WIC 将法线贴图保存为 16 位纹理

opencv realsense 16 位深度图像

生成低位深度的图像文件?