相機幀訪問示例
警告! 相機幀訪問功能(néng)被标記為(wèi)實驗性,因為(wèi)它目前不完全支持所有(yǒu)公(gōng)共 AR Foundation API,并且由于包和 Snapdragon Spaces 服務(wù)端的優化,版本之間的向後兼容性可(kě)能(néng)會受到影響。 |
這個示例演示了如何獲取 RGB 相機幀和内部屬性用(yòng)于圖像處理(lǐ)。有(yǒu)關相機幀訪問的基本信息及 AR Foundation 的 AR Camera Manager 組件的功能(néng),請參閱 Unity 文(wén)檔。要使用(yòng)此功能(néng),需要在 OpenXR 插件設置中(zhōng)啓用(yòng)它,路徑為(wèi):項目設置 > XR 插件管理(lǐ) > OpenXR(> Android 标簽)。
示例工(gōng)作(zuò)原理(lǐ)
将 AR Camera Manager 組件添加到 AR Session Origin > AR Camera 遊戲對象中(zhōng),将啓用(yòng)相機訪問子系統。啓動時,子系統會從設備中(zhōng)檢索有(yǒu)效的傳感器配置。如果找到有(yǒu)效的 Y'UV420sp 或 YUY2 傳感器配置,子系統将選擇該配置作(zuò)為(wèi) CPU 相機圖像的提供者。從概念上講,AR Camera Manager 代表一個單一的相機,不能(néng)同時管理(lǐ)多(duō)個傳感器。
示例場景包含兩個面闆:
● 一個相機視頻面闆,顯示來自設備相機的最新(xīn) CPU 圖像,并帶有(yǒu)暫停和恢複按鈕。
● 一個相機信息面闆,列出設備相機的各種屬性。
獲取 CPU 圖像
每當子系統獲得新(xīn)的相機幀時,AR Camera Manager 将觸發 frameReceived 事件。訂閱此事件可(kě)以讓其他(tā)腳本盡早獲取最新(xīn)的相機幀并對其進行處理(lǐ)。一旦相機幀可(kě)用(yòng),Camera Manager 的 TryAcquireLatestCpuImage 函數将返回一個 XRCpuImage 對象,這個對象代表來自選定設備相機的單張原始圖像。可(kě)以使用(yòng) XRCpuImage 的 Convert 函數提取該圖像的原始像素數據,Convert 函數會返回一個 NativeArray<byte>。Snapdragon Spaces 不支持通過 XRCpuImage.ConvertAsync 進行異步圖像轉換。
有(yǒu)關如何使用(yòng) frameReceived、TryAcquireLatestCpuImage 和 XRCpuImage 的詳細信息,請參閱 Unity 文(wén)檔。
警告! 根據所使用(yòng)的設備,相機幀訪問可(kě)能(néng)需要幾秒(miǎo)鍾才能(néng)初始化。在子系統成功初始化之前,請不要嘗試訪問幀。強烈建議使用(yòng) AR Foundation API 的 frameReceived 事件,以避免出現錯誤。 |
以下示例代碼在觸發 frameReceived 事件時,從 AR Camera Manager 請求 CPU 圖像。如果成功,它将直接将 XRCpuImage 的原始像素數據提取到托管的 Texture2D 的 GetRawTextureData<byte> 緩沖區(qū)中(zhōng),并使用(yòng) Apply 方法應用(yòng)紋理(lǐ)緩沖區(qū)。最後,它會更新(xīn)目标 RawImage 中(zhōng)的紋理(lǐ),使新(xīn)幀在應用(yòng)程序的 UI 中(zhōng)可(kě)見。
以下是 AR Camera Manager 支持的紋理(lǐ)格式:
● RGB24
● RGBA32
● BGRA32
檢索 YUV 平面數據
Snapdragon Spaces 目前支持 Y′UV420sp 和 YUY2 格式。Y′UV420sp 包含一個 Y 緩沖區(qū),後跟交錯的 2x2 子采樣 U/V 緩沖區(qū)。YUY2 包含一個單一的緩沖區(qū),其中(zhōng)交錯了 Y 和 U/V 樣本,每個樣本以 Y-U-Y-V 的形式表示,代表兩個水平像素的色度信息,沒有(yǒu)垂直子采樣。有(yǒu)關 YUV 顔色模型的詳細信息,請參閱 YCbCr 維基百科(kē)文(wén)章中(zhōng)的 YUV 部分(fēn)。
如果不需要 RGB 轉換,可(kě)以通過 XRCpuImage 的 GetPlane 方法檢索原始 YUV 平面數據。此方法返回一個 XRCpuImage.Plane 對象,可(kě)以從中(zhōng)讀取平面數據。通過 XRCpuImage.planeCount 可(kě)以區(qū)分(fēn)格式,該屬性指示表示幀的平面數量。
Y'UV420sp
● Y 平面數據的索引為(wèi) 0,可(kě)以通過 GetPlane(0) 訪問。
● UV 平面數據的索引為(wèi) 1,可(kě)以通過 GetPlane(1) 訪問。
YUY2
YUYV 平面數據的索引為(wèi) 0,可(kě)以通過 GetPlane(0) 訪問。
有(yǒu)關 XRCpuImage.GetPlane 的詳細信息,請參閱 Unity 文(wén)檔。
有(yǒu)關 XRCpuImage.Plane 的詳細信息,請參閱 Unity 文(wén)檔。
以下示例代碼在 frameReceived 事件觸發時請求來自 AR Camera Manager 的 CPU 圖像,如果成功,它會獲取 XRCpuImage 的原始平面數據,并根據 YUV 格式應用(yòng)不同的圖像處理(lǐ)算法。
檢索傳感器/内部信息
攝像頭管理(lǐ)器的 TryGetIntrinsics 函數将返回一個 XRCameraIntrinsics 對象,該對象描述了所選傳感器的物(wù)理(lǐ)特性。有(yǒu)關 XRCameraIntrinsics 的詳細信息,請參閱 Unity 文(wén)檔。(https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.XRCameraIntrinsics.html)
以下示例代碼檢索所選傳感器的内參,并在應用(yòng)程序 UI 中(zhōng)顯示這些信息。
檢索傳感器/外部參數
AR Foundation API 不提供傳感器的外參,不過,您可(kě)以使用(yòng)以下兩種方法來獲取傳感器的外參:
方法 1:Snapdragon Spaces 輸入綁定
Snapdragon Spaces 提供了 ColorCameraPosition 和 ColorCameraRotation 的輸入動作(zuò)。您可(kě)以将這些輸入動作(zuò)與 Tracked Pose Driver (Input System) 配合使用(yòng),通過将它們綁定到 Position Input 和 Rotation Input 上。将 Tracked Pose Driver (Input System) 組件添加到一個 GameObject 上,該 GameObject 的位姿将與彩色攝像頭的外參位姿匹配。
下圖展示了如何使用(yòng)這些輸入綁定。
方法二:Snapdragon Spaces 相機姿态提供器
将Space相機姿态提供器組件添加到場景中(zhōng),并使用(yòng) GetPoseFromProvider 函數來獲取與 AR 相機管理(lǐ)器最新(xīn)的 frameReceived 事件相關的相機姿态。這個姿态是相對于 AR 會話坐(zuò)标系統的。
下面的示例代碼演示了如何獲取所選傳感器的外參并在應用(yòng)程序的 UI 中(zhōng)顯示。
Spaces Camera Pose Provider還可(kě)以用(yòng)作(zuò)Tracked Pose Driver的姿勢提供程序。
提升性能(néng)的提示:
相機訪問操作(zuò)可(kě)能(néng)會消耗較多(duō)計算資源,無論是由于圖像分(fēn)辨率較大還是算法的複雜性。
● 使用(yòng) XRCpuImage.Convert 轉換圖像時,提供較小(xiǎo)的 outputDimensions 以減少計算量。
● 使用(yòng) XRCpuImage.GetPlane 處理(lǐ)圖像時,可(kě)以考慮對數據緩沖區(qū)進行下采樣。
Snapdragon Spaces 提供了直接内存訪問轉換設置,這改變了 XRCpuImage.Convert 讀取和寫入數據的方式。默認情況下,Snapdragon Spaces 使用(yòng) Marshal.Copy 進行幀數據的移動。啓用(yòng)此設置後,Spaces 将使用(yòng) NativeArray<byte> 直接表示源和目标緩沖區(qū)。可(kě)以在 Project Settings > XR Plug-in Management > OpenXR (> Android Tab) > Snapdragon Spaces > Camera Frame Access (Experimental) > Direct Memory Access Conversion 中(zhōng)找到這個設置。啓用(yòng)此設置可(kě)能(néng)會在某些設備上提高性能(néng),但在其他(tā)架構上的表現可(kě)能(néng)會有(yǒu)所下降。以下是建議啓用(yòng)直接内存訪問轉換設置的設備表:
設備 | 建議 |
Lenovo ThinkReality A3 | 性能(néng)提升,推薦使用(yòng) |
Lenovo ThinkReality VRX | 性能(néng)不足,不推薦使用(yòng) |
Spaces AR C相機管理(lǐ)器配置和 DownsamplingStride 屬性在版本 0.21.0 中(zhōng)已被棄用(yòng)。請改用(yòng) XRCpuImage.ConversionParams 設置較小(xiǎo)的 outputDimensions,或者使用(yòng) XRCpuImage.GetPlane 并設置自定義下采樣因子。
檢索其他(tā)的傳感器數據
Spaces AR Camera Manager Config 可(kě)以通過 GetActiveCameraCount 方法獲取設備中(zhōng)的相機傳感器數量。這些信息對于區(qū)分(fēn)雙鏡頭設備和 VR 設備,以及正确處理(lǐ)相機圖像可(kě)能(néng)非常重要。