我想获取从相机的位置 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 的距离的最佳方法是什么?感谢您的帮助。
我找到原因了。相机的 x 和 y 坐标应根据深度图像有效。如果它们不是深度图像,那么您将收到错误。由于现实世界和相机图像的数据存在插值,因此您需要获取CPU坐标的深度图像坐标。当您使用深度图像坐标时,不会出现错误。