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

标签 ios objective-c camera camera-calibration

我想检索与我在 iOS 设备上拍摄的照片相关的镜头畸变系数(注意:不是焦距也不是主点)。据我了解,在 iOS 设备上执行此操作的唯一方法是使用 AVCameraCalibrationDataofficial documentation仅提供有关如何从 AVDepthData 检索相机校准数据的信息,但文档和 this StackOverflow answer这意味着 AVCameraCalibrationData 可以用于图像,而不仅仅是深度数据。

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

最佳答案

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

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

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

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

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

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

"This property's value can be true only when the isDualCameraDualPhotoDeliveryEnabled property is true. To enable camera calibration delivery, set the isCameraCalibrationDataDeliveryEnabled property in a photo settings object."

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

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

photo.cameraCalibrationData

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

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

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

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

关于ios - 如何从 iOS 上的照片输出中检索 AVCameraCalibrationData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846680/

相关文章:

ios - 控制台数据问题

iphone - 如何对私有(private)方法进行前向声明?

android - 我们可以在录制时暂停相机吗

ios - 使用C++文件iOS项目时如何将std::vector<uchar>转换为NSData

ios - UIBezierPath - 你可以 "clip"一个吗?

ios - Swift - Healthkit 的 HKSampleQuery 示例

ios - 如何创建下一个类型 - [key : Object]

ios - 如何在 iOS map 上叠加圆圈

ios - 检查保存到相机胶卷是否成功

java - 为什么 `exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_ROTATE_270));` 什么也不做?