微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TrueDepth AVCaptureSession 期间的世界追踪

如何解决TrueDepth AVCaptureSession 期间的世界追踪

我目前正在使用 iPad 的 TrueDepthAPI。我需要获取帧和深度数据。 为此,我有一个 AVCaptureDataOutputSynchronizerDelegate 类型的类,其中是用于处理处理的 dataOutputSynchronizer 函数

很容易获得内在和外在:

let depthData = syncedDepthData.depthData
let depthPixelBuffer = depthData.depthDataMap

// intrinsic matrix
let intrinsicMatrix = depthData.cameraCalibrationData!.intrinsicMatrix;
let extrinsicsMatrix = depthData.cameraCalibrationData!.extrinsicMatrix;
                                
let fx = intrinsicMatrix[0][0];
let fy = intrinsicMatrix[1][1];
let cx = intrinsicMatrix[2][0];
let cy = intrinsicMatrix[2][1];

我的问题是,是否也可以访问世界跟踪数据?

在其他用例中(例如使用后置摄像头),我从 ARSession() 获得了 ARFrame 并且可以像这样得到它: let cameraTransform = frame.camera.transform;

是否也有办法在 AVCaptureSession 中完成此操作,以及如何在 dataOutputSynchronizer 中完成此操作?

编辑 在对这个主题进行了一些研究时,我发现了 ARFaceTrackingConfiguration,我可以从中挽救转换,但我不确定数据是否适合 3D 重建,因为在设备的另一侧,旋转和东西必须是错了还是仍然正确?

这是我要收集帧数据的方法的完整代码

func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer,didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
    
    if !recEnabled {
        return
    }
    
    guard recEnabled,let syncedDepthData: AVCaptureSynchronizedDepthData =
        synchronizedDataCollection.synchronizedData(for: depthDataOutput) as? AVCaptureSynchronizedDepthData,let syncedVideoData: AVCaptureSynchronizedSampleBufferData =
        synchronizedDataCollection.synchronizedData(for: videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else {
            // only work on synced pairs
            return
    }
    
    
    if syncedDepthData.depthDataWasDropped || syncedVideoData.sampleBufferWasDropped {
        return
    }
    
    let depthData = syncedDepthData.depthData
    let depthPixelBuffer = depthData.depthDataMap //depthData.converting(toDepthDataType: kCVPixelFormatType_DepthFloat32).depthDataMap



    // in/extrinsic matrix
    let intrinsicMatrix = depthData.cameraCalibrationData!.intrinsicMatrix;
    let extrinsicsMatrix = depthData.cameraCalibrationData!.extrinsicMatrix;
                                
    let fx = intrinsicMatrix[0][0];
    let fy = intrinsicMatrix[1][1];
    let cx = intrinsicMatrix[2][0];
    let cy = intrinsicMatrix[2][1];
                    
    // transform matrix

    let sampleBuffer = syncedVideoData.sampleBuffer
    
    guard let videoPixelBuffer = CMSampleBufferGetimageBuffer(sampleBuffer),let formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer) else {
            return
    }        

    // ??

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。