有没有办法通过调用API来找出或计算iPhone相机的视场角(FOV)?还是说你必须亲自手动找出它?
如果无法使用API获取或计算,而是必须将其硬编码到应用程序中,则查找应用程序正在运行的设备的最佳方法是什么?不同设备具有不同的FOV(iPhone 4的FOV比之前的版本大)。此外,每个设备的FOV有多大准确度如何?
我在问这个问题是因为我考虑制作增强现实应用程序,而了解FOV是关键。
有没有办法通过调用API来找出或计算iPhone相机的视场角(FOV)?还是说你必须亲自手动找出它?
如果无法使用API获取或计算,而是必须将其硬编码到应用程序中,则查找应用程序正在运行的设备的最佳方法是什么?不同设备具有不同的FOV(iPhone 4的FOV比之前的版本大)。此外,每个设备的FOV有多大准确度如何?
我在问这个问题是因为我考虑制作增强现实应用程序,而了解FOV是关键。
这个答案使用了一些数学和相机信息来确定一个值。
看看ARKit,它硬编码了0.7392弧度(42.35度)。当我在研究AR时,我只是拿起手机相机,将边缘与一些地标对齐,然后测量角度。我对3GS的估计是横向48度,纵向39度。我对iPhone 4的估计是横向58度,纵向48度。
在互联网上搜索时,似乎有各种各样的说法。这可能可以解释为人们拥有不同型号的手机。我没有从苹果公司找到关于这个主题的官方信息。
如果我再做一次,我会借用各种手机型号,并使用一套针对地平线上地标的测量系统。没有什么比你自己测量的硬数据更好的了。
我的估算方法如下:站在离墙10英尺的地方,看屏幕上的图像。注意图像左右两侧的墙上的点并测量距离。然后使用三角函数计算角度。如果a是距离墙壁的距离,o是沿墙测量的长度,则tan(A)=(o/2)/ a,这是一半的角度。
更新:我纠正了一些错误的计算,并添加了iPhone 4和我如何测量的信息。
我在 iPhone 3gs 上的长尺寸上得到了 47.1539 度。
AVCaptureDevice *device = [...]
NSLog(@"FOV: %lf", device.activeFormat.videoFieldOfView);
记住这是水平视野,对于新手来说,你们有ARKit。
private func getAVCaptureDevice() -> AVCaptureDevice? {
session.configuration?.videoFormat.value(forKey: "device") as? AVCaptureDevice
}
private func setupAVCaptureDeviceFormatWithHighestFOV() {
guard let avDevice = getAVCaptureDevice() else { return }
do {
let activeFormat = avDevice.activeFormat
var formats = avDevice.formats
formats.sort(by: ({ $0.geometricDistortionCorrectedVideoFieldOfView > $1.geometricDistortionCorrectedVideoFieldOfView }))
let wantedFormatWithHighestFOV = formats.first(where: ({$0.corresponds(to: activeFormat)}))
// Continue from here
} catch {
logger.error("error: \(error)")
}
}