Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从iOS上的照片输出中检索AVCameraCalibrationData?_Ios_Objective C_Camera_Camera Calibration - Fatal编程技术网

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

如何从iOS上的照片输出中检索AVCameraCalibrationData?,ios,objective-c,camera,camera-calibration,Ios,Objective C,Camera,Camera Calibration,我正在寻找与我在iOS设备上拍摄的照片相关联的镜头畸变系数(注意:不是焦距,也不是主点)。据我所知,在iOS设备上执行此操作的唯一方法是使用AVCameraCalibrationData。仅提供有关如何从AVDepthData检索相机校准数据的信息,但文档和说明都表明AVCameraCalibrationData可用于图像,而不仅仅是深度数据 拍摄图像时是否可以检索AVCameraCalibrationData信息?如果是,是否有关于此功能的文档?您只能从深度数据输出或照片输出中获取AVCame

我正在寻找与我在iOS设备上拍摄的照片相关联的镜头畸变系数(注意:不是焦距,也不是主点)。据我所知,在iOS设备上执行此操作的唯一方法是使用
AVCameraCalibrationData
。仅提供有关如何从
AVDepthData
检索相机校准数据的信息,但文档和说明都表明
AVCameraCalibrationData
可用于图像,而不仅仅是深度数据


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

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

然而,如果您只需要FOV,那么您只需要该类提供的部分信息——camera intrinsics矩阵——并且您可以从AVCaptureVideoDataOutput中自行获得该信息

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


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

背景:当被问及相机校准时,许多堆栈溢出响应都参考了内部数据,但校准数据通常包括内部数据、外部数据、镜头畸变等。其全部列出

我假设你有通用的摄像头应用程序代码。在该代码中,当拍摄照片时,您可能会调用photoOutput函数,该函数类似于以下内容:

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {...
print("isCameraCalibrationDataDeliverySupported: \(output.isCameraCalibrationDataDeliverySupported)")
输出参数将有一个值,您可以参考该值,以查看是否支持调用摄影机校准,因此,例如,要打印该值,请使用以下内容:

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {...
print("isCameraCalibrationDataDeliverySupported: \(output.isCameraCalibrationDataDeliverySupported)")
注意:在我链接到的文档中,它仅在特定场景中受支持:

“只有当 IsDualCameradualPhotoodeLiveryEnabled属性为true。若要启用 摄像机校准交付,设置 照片设置中的isCameraCalibrationDataDeliveryEnabled属性 对象。”

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

所有这些就绪后,您应该从以下位置获取实际摄像机校准数据:

photo.cameraCalibrationData
只需从该对象中拉出即可获得所需的特定值,例如:

photo.cameraCalibrationData?.extrinsicMatrix
photo.cameraCalibrationData?.intrinsicMatrix
photo.cameraCalibrationData?.lensDistortionCenter
etc.
基本上,您链接到的文档中列出的所有内容,以及我再次链接到的所有内容


还有一件事需要注意,如果您只寻找内在矩阵,那么与这些值中的其他值相比,可以更容易地获得它(即,在环境中没有那么严格)。如果你把它用在计算机视觉上,这就是我用它的目的,有时这就是所需要的。但对于真正酷的东西,你会想要全部的。

谢谢,但我不需要焦距或主要点。也就是说,我根本不需要内在矩阵。我只寻找镜头畸变系数。特别是,我想知道如何从照片输出中检索
AVCameraCalibrationData