Как захватить каждый кадр в ARCore - PullRequest
1 голос
/ 29 марта 2019

Есть ли какое-либо решение для захвата каждого 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;
    }

Кто-нибудь имеет представление о том, что я делаю неправильно.

1 Ответ

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

Поддерживается захват кадров с помощью Sceneform SceneView.startMirroringToSurface () .Это будет отображать текущий вид на поверхности каждый кадр.

Он используется в Образце видеозаписи для захвата видео.

...