问题描述
我目前正在使用 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 (将#修改为@)