如何解决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 举报,一经查实,本站将立刻删除。