gpt4 book ai didi

java - 如何在 ARCore 中捕获每一帧

转载 作者:行者123 更新时间:2023-11-30 05:42:24 32 4
gpt4 key购买 nike

是否有任何解决方案可以将 ARCore 中的每个 SceneView 捕获为位图数组或类似的内容?我想保存 ARCamera 捕获的每一帧以便将来处理它们。

问题是,使用当前代码,我的性能负载很重,这首先会减慢应用程序的速度,然后导致应用程序崩溃。我是 android/Java 新手,我不知道我错在哪里。

除此之外,还有一些令人惊讶的事情。当我记录负责将 ARSenceview 复制到位图数组的 takePhoto() 函数内部 block 时,每个函数调用的时间戳差异并不相同,等于 1 秒/30 帧,尽管对我来说捕获 View 非常重要固定比率。

当应用程序处于捕获模式时,我每帧都会调用此函数。一种可能的错误应该是由于此处获取了大量线程。

    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;
}

有人知道我做错了什么吗?

最佳答案

支持使用 Sceneform 捕获帧 SceneView.startMirroringToSurface() 。这会将当前 View 每帧渲染到表面。

它用于 Video Recording Sample捕捉视频。

关于java - 如何在 ARCore 中捕获每一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419059/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com