是否可以从 ARFrame 访问多个摄像头?

nar*_*ner 5 augmented-reality swift arkit

我有一个ARSessionusing aARWorldTrackingConfiguration作为其配置的一部分。我还通过以下方式启用了面部跟踪:

configuration.userFaceTrackingEnabled = true
Run Code Online (Sandbox Code Playgroud)

func session(_ session: ARSession, didUpdate frame: ARFrame)委托方法中,我可以成功地frame.capturedImage从面向世界的摄像头获取 ,但似乎没有办法从面向世界的摄像头访问框架。

我在这个假设中正确吗?

如果是这样,当同时使用面部和世界跟踪时,是否有其他方法可以访问两个摄像头的帧?

ARG*_*Geo 5

关于两个同时的 ARConfigurations

通常,一个 ARSession 一次只能运行一个 ARConfiguration。但有一个例外:我们可以FaceWorld跟踪配置中使用跟踪配置。但是,ARWorldTrackingConfiguration在这种情况下是“主要Face”配置(因此跟踪是“补充”配置)。

两个摄像头(后置和前置)每秒产生 60 个 ARFrame,包含 RGB、深度、anchors轴、特征点等。每个摄像头都有自己的 ARFrame,可用于定义内部和外部 ARCamera 参数(如 3x3 摄像机矩阵)或 4x4 变换矩阵)。

@NSCopying var currentFrame: ARFrame? { get }
Run Code Online (Sandbox Code Playgroud)

但是,在 ARKit 4.0 中,如果您使用激活的实例属性运行 World tracking config userFaceTrackingEnabled,您只能访问来自后置摄像头的 ARFrames——目前无法访问来自前置摄像头的同步 ARFrames。

let config = ARWorldTrackingConfiguration()

if ARWorldTrackingConfiguration.supportsUserFaceTracking {
    config.userFaceTrackingEnabled = true
}
sceneView.session.run(config, options: [])
    
let currentFrame = sceneView.session.currentFrame
let rearCameraTransform = currentFrame?.camera.transform
let rearCameraAnchors = currentFrame?.anchors
    
print(rearCameraTransform?.columns.3 as Any)
print(rearCameraAnchors as Any)
Run Code Online (Sandbox Code Playgroud)

但是,当然,您可以ARFaceAnchors在 World 跟踪环境中控制所有内容。

在此处输入图片说明

提示:

在 ARKit 4.0 中,您可以ARFaceTrackingConfiguration在以下设备上使用config:

|--------------------|-------------------|-----------------|--------------|
| "TrueDepth sensor" |   "iOS version"   |      "CPU"      | "Depth data" |
|--------------------|-------------------|-----------------|--------------|
|        YES         |  iOS11.....iOS14  |  A11, A12, A13  |     YES      |
|--------------------|-------------------|-----------------|--------------|
|         no         |   iOS13, iOS14    |    A12, A13     |      no      |
|--------------------|-------------------|-----------------|--------------|
Run Code Online (Sandbox Code Playgroud)

因此,作为开发者,您需要检查当前设备是否支持人脸追踪配置:

import ARKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        if !ARFaceTrackingConfiguration.isSupported {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            window?.rootViewController = storyboard.instantiateViewController(withIdentifier: "unsupportedDeviceMessage")
        }
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)