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

问题描述 投票:3回答:1

我正在寻找与我在iOS设备上捕获的照片相关联的镜头失真系数(注意:不是焦距和主要点)。根据我的理解,在iOS设备上这样做的唯一方法是使用AVCameraCalibrationDataofficial documentation仅提供有关如何从AVDepthData检索相机校准数据的信息,但文档和this StackOverflow answer都暗示AVCameraCalibrationData可以与图像一起使用,而不仅仅是深度数据。

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

ios objective-c camera camera-calibration
1个回答
0
投票

背景:当被问及相机校准时,很多这些堆栈溢出响应都引用了内部数据,但校准数据通常包括内部数据,外部数据,镜头失真等。它们全部列出了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)元素。矩阵是水平和垂直焦距。

© www.soinside.com 2019 - 2024. All rights reserved.