#android #arrays #arcore #floatbuffer
#Android #массивы #arcore #floatbuffer
Вопрос:
Я должен напечатать это 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. Можете ли вы предоставить трассировку стека исключений (из консоли / logcat)?
2. Трассировка исключений отсутствует.
3. 2019-03-28 17:22:25.605 24341-24360/com.google.ar.core.examples.java.augmentedimage E / AugmentedImageActivity: Исключение в потоке OpenGL java.lang. Исключение UnsupportedOperationException в java.nio.FloatBuffer.array (FloatBuffer.java:601)
Ответ №1:
В зависимости от реализации 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);
}