相机帧获取示例(实验性)

警告

相机帧访问功能被标记为实验性功能,因为它目前尚未完全支持所有公共 AR Foundation API,而且在软件包和 Snapdragon Spaces Service 方面的优化会导致版本之间的向后兼容性被破坏。

该示例演示了如何通过获取 RGB 相机帧和内在属性对图像进行处理。有关相机帧访问的基本信息以及 AR Foundation 的 AR 相机管理器AR Camera Manager)组件的作用,请参阅 Unity 文档。使用此功能,必须先打开 Project Settings > XR Plug-in Management > OpenXR (> Android Tab),找到 OpenXR 插件设置并启用该功能。此外,该示例要求在 Project Settings > Player > Android > Script Compilation 中允许“不安全”代码。

示例的工作原理

AR Camera Manager 相机管理器组件添加到 AR Session Origin > AR Camera 游戏对象中,相机获取子系统将被启用。在启动时,该子系统将从查看器(viewer)设备检索有效的传感器配置。如果找到有效的 YUV420 传感器配置,该子系统将选择此配置为 CPU 相机图像提供程序。概念上,AR Camera Manager 表示一个单独的相机,不会同时管理多个传感器。

示例场景包括两个面板:

  • camera feed(相机反馈) 面板显示来自设备相机的最新 CPU 图像,并带有 暂停(Pause)恢复(Resume) 按钮。

  • camera info(相机信息) 面板枚举设备相机的各种属性。

1

检索 CPU 图像

相机管理器的 TryAcquireLatestCpuImage 尝试获取最新 CPU 图像函数将返回一个 XRCpuImage 对象,该对象表示所选设备相机中的单个原始图像。可以使用 XRCpuImageConvert 转换函数提取此图像的原始像素数据,该函数返回一个 NativeArray<byte>

重要

XRCpuImage 对象在转换后必须进行显式处理。要做到这一点,请使用 XRCpuImageDispose 曝光函数。如果未处理 XRCpuImage 对象,则会泄漏内存,直到相机获取子系统被销毁。

如果在转换之前分配了 NativeArray<byte> ,则此缓冲区在复制或操作后也必须被处理。要做到这一点,请使用 NativeArray<T>Dispose 函数。如果未处理 NativeArray<byte> ,则会泄漏内存,直到相机获取子系统被销毁。

有关如何使用 TryAcquireLatestCpuImage 尝试获取最新 CPU 图像和 XRCpuImage 的详细信息,请参阅 Unity 文档

下面的示例代码首先从 AR Camera Manager 请求一个 CPU 图像。如果成功,它将 XRCpuImage 的原始像素数据直接提取到一个受控 Texture2DGetRawTextureData<byte> 缓冲区中,并在之后使用 Apply 函数应用纹理缓冲区。最后,它更新目标 RawImage 中的纹理,使新帧显示在应用程序 UI 中。

AR Camera Manager 支持以下纹理格式:

  • RGB24

  • RGBA32

  • BGRA32

检索传感器本质

相机管理器的 TryGetIntrinsics 函数将返回一个 XRCameraIntrinsics 对象,该对象描述了所选传感器的物理特性。有关 XRCameraIntrinsics 的详细信息,请参阅 Unity 文档

下面的示例代码检索所选传感器的内部参数,并显示在应用程序 UI 中。

最后更新于

这有帮助吗?