【问题标题】:Swift: Get the TruthDepth camera parameters for face tracking in ARKitSwift:在 ARKit 中获取人脸跟踪的 TruthDepth 相机参数
【发布时间】:2020-11-05 16:16:00
【问题描述】:

我的目标:

在进行面部跟踪时,我正在尝试获取 TruthDepth 相机的 TruthDepth 相机参数(例如内在、外在、镜头失真等)。我读到OpenCV 有一些例子和可能的例子。我只是想知道是否应该在 Swift 中实现类似的目标。

我已阅读并尝试过的内容:

我阅读了有关 ARCamera 的苹果文档:intrinsics 和 AVCameraCalibrationData: extrinsicMatrixintrinsicMatrix

但是,我发现的只是AVCameraCalibrationDataARCamera 的声明:


对于AVCameraCalibrationData


对于内在矩阵

var intrinsicMatrix: matrix_float3x3 { get }

对于外部矩阵

var extrinsicMatrix: matrix_float4x3 { get }

我还阅读了这篇文章:get Camera Calibration Data on iOS 并尝试了 Bourne 的建议:

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        let ex = photo.depthData?.cameraCalibrationData?.extrinsicMatrix
        //let ex = photo.cameraCalibrationData?.extrinsicMatrix
        let int = photo.cameraCalibrationData?.intrinsicMatrix
        photo.depthData?.cameraCalibrationData?.lensDistortionCenter
        print ("ExtrinsicM: \(String(describing: ex))")
        print("isCameraCalibrationDataDeliverySupported: \(output.isCameraCalibrationDataDeliverySupported)")
    }

但它根本不打印矩阵。


对于ARCamera,我读过Andy Fedoroff 的 Focal Length of the camera used in RealityKit

var intrinsics: simd_float3x3 { get }
func inst (){
    sceneView.pointOfView?.camera?.focalLength
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print(" Focal Length: \(String(describing: self.sceneView.pointOfView?.camera?.focalLength))")
        print("Sensor Height: \(String(describing: self.sceneView.pointOfView?.camera?.sensorHeight))")
        // SENSOR HEIGHT IN mm
        let frame = self.sceneView.session.currentFrame
        // INTRINSICS MATRIX
        print("Intrinsics fx: \(String(describing: frame?.camera.intrinsics.columns.0.x))")
        print("Intrinsics fy: \(String(describing: frame?.camera.intrinsics.columns.1.y))")
        print("Intrinsics ox: \(String(describing: frame?.camera.intrinsics.columns.2.x))")
        print("Intrinsics oy: \(String(describing: frame?.camera.intrinsics.columns.2.y))")
    }
}

它显示了渲染相机参数:

Focal Length: Optional(20.784610748291016)
Sensor Height: Optional(24.0)
Intrinsics fx: Optional(1277.3052)
Intrinsics fy: Optional(1277.3052)
Intrinsics ox: Optional(720.29443)
Intrinsics oy: Optional(539.8974)

但是,这仅显示渲染相机,而不是我用于面部跟踪的 TruthDepth 相机。


那么任何人都可以帮助我开始获取 TruthDepth 相机参数,因为除了声明之外,文档并没有真正显示任何示例?

非常感谢!

【问题讨论】:

  • 嘿,我也有类似的问题。您是否设法使用接受的答案得到它?如果是这样,您是否发现内在参数对您的应用来说是准确的,它们是否会随着时间而改变?这对我的前置摄像头 3D 姿势估计项目真的很有帮助,谢谢!

标签: ios swift augmented-reality arkit camera-calibration


【解决方案1】:

您无法打印内在函数的原因可能是因为您在可选链接中获得了nil。你应该看看苹果的言论herehere

仅当您在请求捕获时指定了isCameraCalibrationDataDeliveryEnabledisDualCameraDualPhotoDeliveryEnabled 设置时,才会显示相机校准数据。对于包含深度数据的捕获中的相机校准数据,请参阅 AVDepthData cameraCalibrationData 属性。

要请求捕获照片旁边的深度数据(在受支持的设备上),请在请求照片捕获时将照片设置对象的 isDepthDataDeliveryEnabled 属性设置为 true。如果您未请求深度数据传递,则此属性的值为nil

所以如果要获取TrueDepth相机的intrinsicMatrixextrinsicMatrix,则应使用builtInTrueDepthCamera作为输入设备,将pipeline的照片输出的isDepthDataDeliveryEnabled设置为true,并设置isDepthDataDeliveryEnabledtrue 拍摄照片时。然后您可以通过访问photo 参数的depthData.cameraCalibrationData 属性来访问photoOutput(_: didFinishProcessingPhoto: error:) 回调中的内在矩阵。

这是code sample for setting up such a pipeline

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 2020-04-07
    • 2012-06-03
    • 2021-05-15
    • 2016-09-07
    • 2012-05-17
    • 2017-04-22
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多