Есть ли какое-либо решение для захвата каждого SceneView в ARCore в виде массива растрового изображения или чего-то в этом роде?Я хочу сохранить каждый кадр, захваченный ARCamera для дальнейшей обработки в будущем.
Проблема в том, что в текущем коде у меня большая нагрузка на производительность, которая сначала замедляет приложение, а затем приводит ксбой приложения.Я новичок в Android / Java, и я не могу понять, где я не прав.
Помимо этого, что-то еще удивляет.Когда я регистрирую внутренний блок функции takePhoto (), который отвечает за копирование ARSenceview в bitmapsarray, разница временных меток каждого вызова функции не одинакова и равна 1 с / 30 кадрам, хотя для меня очень важно захватить представления вфиксированное соотношение.
Когда приложение находится в режиме захвата, я вызываю эту функцию каждый кадр.Одна возможная ошибка должна из-за большого числа потоков здесь.
private void takePhoto()
{
view = arFragment.getArSceneView();
// NOTE: Create a handler thread to offload the processing of the image
final HandlerThread handlerThread = new HandlerThread("PixelCopier");
handlerThread.start();
// NOTE: Make request to copy
PixelCopy.request(view, bitmap, copyResult -> {
if(copyResult == PixelCopy.SUCCESS)
{
bitmapsBuffer[bufferIndex] = bitmap;
bufferIndex++;
if(bufferIndex == 120)
{
bufferIndex = 0;
FlushBitmapsBuffer();
}
}
else
{
messenger.message("Failed to copyPixel: " + copyResult);
}
handlerThread.quitSafely();
}, new Handler(handlerThread.getLooper()));
}
Затем, собрав 120 кадров, я пытаюсь записать временный массив растровых изображений на SD с помощью другой службы.
private void FlushBitmapsBuffer()
{
Intent intent = new Intent(MainActivity.this, DataCopyService.class);
intent.putExtra("BitmapsBuffer", bitmapsBuffer);
intent.putExtra("StorageDataRoot",
storageData.getRootDir());
intent.putExtra("StorageDataProj",
storageData.getProjectDir().getAbsolutePath());
startService(intent);
}
служба работает следующим образом:
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
messenger.log("Service " + TAG + " started.");
bitmapsBuffer = (Bitmap[]) intent.getParcelableArrayExtra("BitmpasBuffer");
File file;
file = new File(intent.getStringExtra("StorageDataRoot"));
storageData.setRootDir(file);
file = new File(intent.getStringExtra("StorageDataProj"));
storageData.setProjectDir(file);
new Thread(new Runnable() {
@Override
public void run() {
messenger.log("Service inner thread.");
// Save the data here using a file manager class
stopSelf();
}
}).start();
return Service.START_STICKY;
}
Кто-нибудь имеет представление о том, что я делаю неправильно.