我希望检索与我在iOS设备上捕获的照片相关的镜头失真系数(注意:不是焦距或主要点)。从我的理解中,在iOS设备上这样做的唯一方法是使用AVCameraCalibrationData
。官方文档仅提供有关如何从AVDepthData
检索摄像机校准数据的信息,但是文档和此stackoverflow答案都暗示AVCameraCalibrationData
可以与图像一起使用,而不仅仅是与深度数据一起使用。
捕获图像时是否可以检索AVCameraCalibrationData
信息?如果是这样,是否有有关此功能的文档?
背景:当询问摄像机校准时,很多这些堆栈溢出响应都在引用固有数据,但是校准数据通常包括内在数据,外部数据,镜头失真等。在您链接到的iOS文档中。
我将假设您已经有一般的相机应用程序代码。在该代码中,当拍摄图片时,您可能会打电话给看起来像这样的光图功能:
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {...
输出参数将具有一个值,您可以参考以查看是否支持摄像机校准,称为iscameracalibrationDataDAdeLiverSupported,因此,例如,要打印出来,使用类似的内容:
print("isCameraCalibrationDataDeliverySupported: (output.isCameraCalibrationDataDeliverySupported)")
请注意,在我链接到的文档中,仅在特定方案中支持:
"此属性的值只有在 IsdualCameradualPhotOdeLiveryEnabled属性是正确的。启用 相机校准交付,设置 照片设置中 对象。"
这很重要,请注意这一点,以避免不必要的压力。使用实际值进行调试,并确保您启用了适当的环境。
有了所有这些,您应该从:
中获取实际的摄像机校准数据photo.cameraCalibrationData
只需退出该对象以获取您要寻找的特定值,例如:
photo.cameraCalibrationData?.extrinsicMatrix
photo.cameraCalibrationData?.intrinsicMatrix
photo.cameraCalibrationData?.lensDistortionCenter
etc.
基本上您链接到的文档中列出的所有内容,我再次链接到。
还有一件事要注意,如果您只是寻找固有的矩阵,那么通过堆栈溢出中概述的方法,可以比其余的这些值更容易获得(即环境的严格)。如果您将其用于计算机视觉,这就是我正在使用的目的,这有时就是所需的一切。但是对于真正很酷的东西,您将需要所有内容。
您只能从深度数据输出或照片输出中获得Avcameracalibrationdata。
但是,如果您需要的只是FOV,则您只需要一部分提供的信息 - 相机内在矩阵 - 您可以从avcapturevideodataoutput中获得该信息。
在AvCaptureConnection上设置了CamerainTrinsicmatrixDelixDeliveryEnabled,将相机设备连接到捕获会话。(请注意,您应该先检查cameraintrinsicmatrixdeliveryspulported;并非所有捕获格式都支持内在。)
当视频输出供应示例缓冲区时,请检查每个样本缓冲区的附件kcmsamplebufferattachmentkey_cameraintrinsicmatrix键。如cmmsamplebuffer.h(有人应该提交有关将此信息输入在线文档中的雷达),该附件的值是编码MATRIX_FLOAT3X3的CFDATA,以及(0,0)和(1,1)元素矩阵是水平和垂直焦距。