Я не могу напечатать этот массив. Приложение перестает работать после публикации этой строки - PullRequest
1 голос
/ 28 марта 2019

Я должен напечатать это floatbuffer как array, и в документации есть функция для этого, но эта функция не работает. Я не могу понять, что я делаю не так?

Я пытался использовать floatBuffer.toString(), но он печатает array, описанный в документации (ARCore). Это неверные результаты.

 Camera camera = frame.getCamera();
 CameraIntrinsics cameraIntrinsics=camera.getImageIntrinsics();
 float[] focal=cameraIntrinsics.getFocalLength();
 Log.e("Focals",Arrays.toString(focal));
 int [] getDiminsions=cameraIntrinsics.getImageDimensions();
 Log.e("Dimensions ", Arrays.toString(getDiminsions));
 backgroundRenderer.draw(frame);
 PointCloud pointCloud=frame.acquirePointCloud();
 FloatBuffer floatBuffer=pointCloud.getPoints();
 FloatBuffer readonly=floatBuffer.asReadOnlyBuffer();
 //final boolean res=readonly.hasArray();
 final float[] points=floatBuffer.array();
        //what should I do

Согласно документации (ARCore) каждая точка в floatBuffer имеет 4 значения: координаты x, y, z и значение достоверности.

1 Ответ

0 голосов
/ 28 марта 2019

В зависимости от реализации FloatBuffer, метод array() может быть недоступен, если буфер не поддерживается массивом. Вам может не понадобиться массив, если все, что вы собираетесь сделать, это перебрать значения.

FloatBuffer floatBuffer = pointCloud.getPoints();
// Point cloud data is 4 floats per feature, {x,y,z,confidence}
for (int i = 0; i < floatBuffer.limit() / 4; i++) {
    // feature point
    float x = floatBuffer.get(i * 4);
    float y = floatBuffer.get(i * 4 + 1);
    float z = floatBuffer.get(i * 4 + 2);
    float confidence = floatBuffer.get(i * 4 + 3);

    // Do something with the the point cloud feature....
}

Но если вам нужно использовать массив, вам нужно вызвать hasArray(), а если нет, выделить массив и скопировать данные.

FloatBuffer floatBuffer = pointCloud.getPoints().asReadOnlyBuffer();
float[] points;
if (floatBuffer.hasArray()) {
  // Access the array backing the FloatBuffer
  points = floatBuffer.array();
} else {
 // allocate array and copy.
 points = new float[floatBuffer.limit()];
 floatBuffer.get(points);
}
...