“1 个缓冲区在出列时被释放”Google Depth API 中的错误

问题描述 投票:0回答:1

我想获取从相机的位置 x 和 y 到所有深度像素的距离。现在。在文档中,有 getMillimetersDepth() 返回以毫米为单位的深度。我认为,这是相同的功能。但是,当我在他们的“helloar”代码中使用该函数时,我收到错误。我使用了不同的 x 和 y 值。

HelloArRenderer.kt 中,我在这里调用了 getMillimeterDepth() 函数:

if (camera.trackingState == TrackingState.TRACKING && shouldGetDepthImage) {
      try {
        val depthImage = frame.acquireDepthImage16Bits()
        //Get center x and y position of surface
        val point = render.point
         
        val depthValue = getMillimetersDepth(depthImage, 100, 100)

        //Log.d("DepthValue", depthValue.toString())

        backgroundRenderer.updateCameraDepthTexture(depthImage)
        depthImage.close()
      } catch (e: NotYetAvailableException) {
        // This normally means that depth data is not available yet. This is normal so we will not
        // spam the logcat with this.
      }
    }

getMillimetersDepth() 函数在哪里

/** Obtain the depth in millimeters for [depthImage] at coordinates ([x], [y]). */
fun getMillimetersDepth(depthImage: Image, x: Int, y: Int): Int {
  // The depth image has a single plane, which stores depth for each
  // pixel as 16-bit unsigned integers.
  val plane = depthImage.planes[0]
  val byteIndex = x * plane.pixelStride + y * plane.rowStride
  val buffer = plane.buffer.order(ByteOrder.nativeOrder())
  val depthSample = buffer.getShort(byteIndex)
  return depthSample.toInt()
}

我收到以下错误。

错误1,如果x和y的值增加。我使用的是分辨率为2219*1080的Google Pixel 7a。

E/Surface:freeAllBuffers:出队时释放了 1 个缓冲区! E/AndroidRuntime:致命异常:GLThread 142 进程:com.example.arcoretest,PID:26925 java.lang.IndexOutOfBoundsException:索引= 366200超出范围(限制= 28800,nb = 2) 在 java.nio.Buffer.checkIndex(Buffer.java:717) 在 java.nio.DirectByteBuffer.getShort(DirectByteBuffer.java:484) 在 com.google.ar.core.examples.kotlin.helloar.HelloArRenderer.getMillimetersDepth(HelloArRenderer.kt:432) 在 com.google.ar.core.examples.kotlin.helloar.HelloArRenderer.onDrawFrame(HelloArRenderer.kt:316) 在 com.example.arcoretest.java.common.samplerender.SampleRender$1.onDrawFrame(SampleRender.java:72) 在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1573) 在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)

错误2

失败:图像的地标太少。 [必填:9,实际:0]。; 初始化器的 SSBA 无法产生有效的输出。 === 源位置跟踪:=== 第三方/红木/感知/里程计/visual_inertial_initialization/bundle_ adjustment_initializer.cc:330

为什么我会收到这些错误?计算距相机坐标 x 和 y 的距离的最佳方法是什么?感谢您的帮助。

android google-api opengl-es surfaceview arcore
1个回答
0
投票

我找到原因了。相机的 x 和 y 坐标应根据深度图像有效。如果它们不是深度图像,那么您将收到错误。由于现实世界和相机图像的数据存在插值,因此您需要获取CPU坐标的深度图像坐标。当您使用深度图像坐标时,不会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.