ARfoundation - это унифицированный API Unity для доступа к функциям дополненной реальности как на iOS через ar-Kit, так и в Android через ar-Core.
Контекст:
У них есть API для доступа к изображению с камеры на процессоре, который мы можем найти здесь: https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@1.0/manual/cpu-camera-image.html
Ват Я пробовал:
Я создал минималистичную сцену, как описано в руководствах, с ничего, кроме направленного света, ArSession и ArSessionRoot с ArPlaneManager и ArParticleManager.
Затем я добавляю пример сценария, приведенный здесь в сценарии документации: https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@1.0/manual/cpu-camera-image.html#synchronously-convert-to-grayscale-and-color
только замена
if (!cameraSubsystem.TryGetLatestImage(out image))
return;
с
if (!cameraSubsystem.TryGetLatestImage(out image))
{
Debug.LogError("getting latest image failed again");
image.Dispose();
/*/ image is a struct, so it's never null.
Probably it only needs to be disposed of if it has properly been used
which would explain why they didn't dispose of it in the example code.
Still, since it might be that trying-to-get-the-latest-image fails the first couple of times and would after that work,
I'd still like to make sure it doesn't fail because there are too many image instances
The documentation says: The CameraImage is a struct which represents a native resource. When you are finished using it, you must call Dispose on it to release it back to the system. Although you may hold a CameraImage for multiple frames, most platforms have a limited number of them, so failure to Dispose them may prevent the system from providing new camera images.
//*/
return;
}
Debug.Log("getting latest image succeeded for once");
У кого-то, похоже, возникла та же проблема, что и у меня, поэтому я задал этот вопрос и на этом форуме: https://forum.unity.com/threads/arfoundation-camera-api-not-working-on-android.663979/#post-4510765
Проблема:
arCameraBackground правильно отображает канал веб-камеры, cameraTrackedPoseDriver корректно обновляет положение виртуальной камеры, поскольку я могу правильно видеть эффекты arPlaneManager и arPointCloudManage (плоскости обнаруживаются и правильно отображаются, а глубина, очевидно, воспринимается с характерными точками, отображаемыми в виде частиц, когда камера перемещена)
НО: несмотря на то, что опыт AR работает нормально, я получаю спам с журналом ошибок и никогда не могу пройти мимо этого.
Это означает, что событие вызывается снова и снова, но попытка получить последнее изображение всегда всегда заканчивается неудачей.
Мне нужен доступ к изображению с камеры на процессоре, я пробовал как синхронные, так и асинхронные примеры, оба возвращают false, когда я пытаюсь получить последнее изображение. Любая помощь или подсказка высоко ценится, спасибо =)
* РЕДАКТИРОВАТЬ: это на самом деле работает на Android для меня, но не на iOS