iPhone SDK - 获取/计算相机视场角(FOV)(增强现实)

8

有没有办法通过调用API来找出或计算iPhone相机的视场角(FOV)?还是说你必须亲自手动找出它?

如果无法使用API获取或计算,而是必须将其硬编码到应用程序中,则查找应用程序正在运行的设备的最佳方法是什么?不同设备具有不同的FOV(iPhone 4的FOV比之前的版本大)。此外,每个设备的FOV有多大准确度如何?

我在问这个问题是因为我考虑制作增强现实应用程序,而了解FOV是关键。

5个回答

4
我拍了一张纸的照片,这张纸是我从远处测量过的。然后我观察了纸的大小与照片中的图像的比例。
我的数据显示,在距离为56厘米时,您可以完全拍摄到一个大约40厘米x 60厘米的物体(即它恰好占据屏幕大小)。
使用这个数据,我进行了一些简单的三角函数计算,得出: 垂直视场角:2 * atan(58.5/2 / 56.5)->约55度 水平视场角:2 * atan(21.5/2 / 56.5)-> 42度

我使用的是iPhone 4,其相机的宽高比为4:3,与55/42非常匹配。 - twerdster
垂直视场角:2*atan(58.5/2 / 56.5) -> ~55度??? 这个数学计算似乎有问题... - Duck
@数字机器人 - 你得到的答案可能是弧度,所以你需要将其转换为角度。因此,2 * atan(58.5 / 2/56.5)/ 2 / pi * 360〜55度。 - twerdster

2

这个答案使用了一些数学和相机信息来确定一个值。

看看ARKit,它硬编码了0.7392弧度(42.35度)。当我在研究AR时,我只是拿起手机相机,将边缘与一些地标对齐,然后测量角度。我对3GS的估计是横向48度,纵向39度。我对iPhone 4的估计是横向58度,纵向48度。

在互联网上搜索时,似乎有各种各样的说法。这可能可以解释为人们拥有不同型号的手机。我没有从苹果公司找到关于这个主题的官方信息。

如果我再做一次,我会借用各种手机型号,并使用一套针对地平线上地标的测量系统。没有什么比你自己测量的硬数据更好的了。

我的估算方法如下:站在离墙10英尺的地方,看屏幕上的图像。注意图像左右两侧的墙上的点并测量距离。然后使用三角函数计算角度。如果a是距离墙壁的距离,o是沿墙测量的长度,则tan(A)=(o/2)/ a,这是一半的角度。

更新:我纠正了一些错误的计算,并添加了iPhone 4和我如何测量的信息。


我也注意到了不同的说法,并且我也在考虑同样的事情,但是如果可能的话,我想避免获取设备的麻烦。 - quano
1
你的数值不正确:.7392弧度不等于133度...大约是42度。你怎么得出3GS的95度?!95度的视场角意味着设备将具有极宽的角度。 - rockeye
你说得对,我的角度计算有误。我已经更正了这些错误,包括我的方法,并添加了iPhone 4的数据。谢谢。 - Jon Steinmetz

1

我在 iPhone 3gs 上的长尺寸上得到了 47.1539 度。


0
你可以简单地问:
AVCaptureDevice *device = [...]
NSLog(@"FOV: %lf", device.activeFormat.videoFieldOfView);

记住这是水平视野,对于新手来说,你们有ARKit。


0
如果我理解你的问题正确,你需要在ARKit配置下得到fov - 那么你可以这样获取它:
(查看字段geometricDistortionCorrectedVideoFieldOfView)
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)")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接