'Is it possible to access multiple cameras from ARFrame?
I have an ARSession using a ARWorldTrackingConfiguration as part of its configuration. I've also enabled face tracking via:
configuration.userFaceTrackingEnabled = true
In the func session(_ session: ARSession, didUpdate frame: ARFrame) delegate method, I can successfully get the frame.capturedImage from the world-facing camera, but it doesn't seem like there's a way to access the frame from the face-facing camera.
Am I correct in this assumption?
If so, is there some other way to access the frames of both cameras when using face and world tracking together?
Solution 1:[1]
About two simultaneous ARConfigurations
As a rule, one ARSession is able to run just one ARConfiguration at a time. But there's an exception: we can use Face tracking config within a World tracking configuration. However, ARWorldTrackingConfiguration is a "main" in that case (hence Face tracking is a "supplemental" config).
Both cameras (rear and front) produce 60 ARFrames per second, containing RGB, Depth, anchors, axis, feature points, etc. And each camera has its own ARFrames, what can be used for defining intrinsic and extrinsic ARCamera parameters (like 3x3 camera matrix or 4x4 transform matrix).
@NSCopying var currentFrame: ARFrame? { get }
However, in ARKit 5.0, if you are running World tracking config with activated instance property userFaceTrackingEnabled, you can get access only to ARFrames coming from rear camera – at the moment there's no access to simultaneous ARFrames coming from front camera.
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)
But, of course, you can control all ARFaceAnchors in World tracking environment.
Tip:
In ARKit 5.0 you can use ARFaceTrackingConfiguration config on the following devices:
| TrueDepth sensor | iOS version | CPU | Depth data |
|---|---|---|---|
| if YES | iOS11 ....... iOS15 | A11, A12, A13, A14, A15 | true |
| if NO | iOS13 ....... iOS15 | A12, A13, A14, A15 | false |
So, as a developer, you need to check whether current device supports Face tracking config or not:
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
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |

