如何从 iOS 上的照片输出中检索 AVCameraCalibrationData?

Posted

技术标签:

【中文标题】如何从 iOS 上的照片输出中检索 AVCameraCalibrationData?【英文标题】:How to retrieve AVCameraCalibrationData from photo output on iOS? 【发布时间】:2019-02-23 22:03:37 【问题描述】:

我正在寻找与我在 ios 设备上拍摄的照片相关的镜头畸变系数(注意:不是焦距也不是主点)。据我了解,在 iOS 设备上这样做的唯一方法是使用AVCameraCalibrationData。 official documentation 仅提供有关如何从 AVDepthData 检索相机校准数据的信息,但文档和 this *** answer 都暗示 AVCameraCalibrationData 可以用于图像,而不仅仅是深度数据。

是否可以在捕获图像时检索AVCameraCalibrationData 信息?如果有,是否有关于此功能的文档?

【问题讨论】:

【参考方案1】:

背景:当被问及相机校准时,许多堆栈溢出响应都引用了内在数据,但校准数据通常包括内在数据、外在数据、镜头失真等。所有这些都在here in the iOS documentation you linked to 中列出。

我假设您已准备好通用相机应用程序代码。在该代码中,当拍摄照片时,您可能会调用看起来像这样的 photoOutput 函数:

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) ...

输出参数将有一个值,您可以参考以查看是否支持相机校准,称为 isCameraCalibrationDataDeliverySupported,例如,要打印出来,请使用以下内容:

print("isCameraCalibrationDataDeliverySupported: \(output.isCameraCalibrationDataDeliverySupported)")

在我链接的文档中注意,它仅在特定场景下受支持:

"这个属性的值只有在 isDualCameraDualPhotoDeliveryEnabled 属性为 true。启用 相机校准交付,设置 照片设置中的 isCameraCalibrationDataDeliveryEnabled 属性 对象。”

所以这很重要,请注意这一点以避免不必要的压力。使用实际值进行调试并确保启用了正确的环境。

一切就绪后,您应该从以下位置获取实际的相机校准数据:

photo.cameraCalibrationData

只需拉出该对象即可获取您要查找的特定值,例如:

photo.cameraCalibrationData?.extrinsicMatrix
photo.cameraCalibrationData?.intrinsicMatrix
photo.cameraCalibrationData?.lensDistortionCenter
etc.

基本上是您链接到的文档中列出的所有内容以及我再次链接到的所有内容。

还有一点需要注意,如果您只是在寻找内在矩阵,那么与这些值的其余部分 through the approach outlined in the the stack overflow 相比,它可以更容易地获得(即环境不那么严格)。如果您将它用于计算机视觉,这就是我使用它的目的,有时这就是所需要的。但是对于非常酷的东西,你会想要的。

【讨论】:

【参考方案2】:

AVCameraCalibrationData 只能从深度数据输出或照片输出中获取。

但是,如果您只需要 FOV,则只需要该类提供的部分信息(相机内在矩阵),您可以从 AVCaptureVideoDataOutput 中自行获取。

在将相机设备连接到捕获会话的 AVCaptureConnection 上设置 cameraIntrinsicMatrixDeliveryEnabled。 (请注意,您应该首先检查 cameraIntrinsicMatrixDeliverySupported;并非所有捕获格式都支持内在函数。)

当视频输出提供样本缓冲区时,请检查每个样本缓冲区的附件是否有 kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix 键。如 CMSampleBuffer.h 中所述(有人应该提交有关将此信息获取到在线文档的雷达),该附件的值是一个编码 matrix_float3x3 的 CFData,以及它的 (0,0) 和 (1,1) 元素矩阵是水平和垂直焦距。

【讨论】:

谢谢,但我不需要焦距和主点。 IE。我根本不需要内在矩阵。我只在寻找镜头畸变系数。特别是,我想弄清楚如何从照片输出中检索AVCameraCalibrationData

以上是关于如何从 iOS 上的照片输出中检索 AVCameraCalibrationData?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从照片应用程序中检索所有照片/视频并将其复制到我的应用程序?

如何从 iOS 照片库中获取图像并在 UIWebView 中显示

在 iOS 中访问 Photos.sqlite 以检索照片元数据

从 iPhone 检索最后几张照片

如何使用 Photos 框架从 iOS 上的相机胶卷中获取最新照片?

iOS:如何从磁盘上的照片文件中提取缩略图和元数据