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

sbtkgmzw  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(161)

我有一个ARSession,它使用ARWorldTrackingConfiguration作为其配置的一部分。我还通过以下方式启用了面部跟踪:

configuration.userFaceTrackingEnabled = true

func session(_ session: ARSession, didUpdate frame: ARFrame)代理方法中,我可以成功地从面向世界的摄像机中获取frame.capturedImage,但似乎没有办法从面向脸部的摄像机中访问帧。
我的这个假设正确吗?
如果是这样,当同时使用面部和世界跟踪时,是否有其他方法可以访问两个摄像机的帧?

fykwrbwg

fykwrbwg1#

关于两个同步AR配置

一般来说,一个ARSession一次只能运行一个ARConfiguration。但是有一个例外:我们可以在World跟踪配置中使用Face跟踪配置。但是,ARWorldTrackingConfiguration在这种情况下是“主”配置(因此Face跟踪是“补充”配置)。
两台摄像机(前后)每秒产生60个ARFrame,包含RGB、深度、anchors、轴、特征点等。每台摄像机都有自己的ARFrame,可用于定义***内部和外部ARCamera参数***(如3x 3摄像机矩阵或4x 4变换矩阵)。

@NSCopying var currentFrame: ARFrame? { get }

然而,在ARKit 5.0中,如果您正在使用激活的示例属性userFaceTrackingEnabled运行World tracking config,您只能访问来自后置摄像头的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)

但是,当然,你可以在World跟踪环境中控制所有的ARFaceAnchors

提示:

在ARKit 5.0中,您可以在以下设备上使用**ARFaceTrackingConfiguration**config:
| 真深度传感器|iOS版本|中央处理器|深度数据|
| - -|- -|- -|- -|
| 如果是|第11代操作系统.......第15代操作系统|A11、A12、A13、A14、A15|真的|
| 如果否|第13代操作系统.......第15代操作系统|A12、A13、A14和A15|假的|
因此,作为开发人员,您需要检查当前设备是否支持面部跟踪配置:

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

相关问题