如何提高 ARKit 中的相机质量

How to improve camera quality in ARKit

我正在构建一个 ARKit 应用程序,我们希望能够在其中拍摄场景照片。我发现 ARCamera 视图的图像质量不足以在 iPad Pro 上拍照。

标准相机图像:

AR相机图像:

我看到一个 Apple 论坛 post 提到这可能是 iPad Pro 10.5 特定的并且与固定镜头位置有关 (https://forums.developer.apple.com/message/262950#262950)。

是否有public更改设置的方法?

或者,我尝试使用 AVCaptureSession 拍摄普通照片并将其应用于 sceneView.scene.background.contents 以在拍摄照片时将模糊图像切换为高分辨率图像,但无法获取 AVCapturePhotoOutput使用 ARKit

更新: 恭喜提交 feature requests 的人!在 iOS 11.3(又名 "ARKit 1.5")中,您至少可以控制一些捕获设置。您现在可以使用默认启用的自动对焦获得 1080p。

检查 ARWorldTrackingConfiguration.supportedVideoFormats for a list of ARConfiguration.VideoFormat objects, each of which defines a resolution and frame rate. The first in the list is the default (and best) option supported on your current device, so if you just want the best resolution/framerate available you don't have to do anything. (And if you want to step down for performance reasons by setting videoFormat,基于数组顺序而不是硬编码大小可能更好。)

自动对焦在 iOS 11.3 中默认开启,因此您的示例图片(主体离相机较近)应该会好得多。如果出于某种原因您需要将其关闭,there's a switch for that.


仍然没有 API 用于更改 ARKit 使用的底层捕获 session 的相机设置。

据 WWDC 的工程师称,ARKit 使用有限的相机捕捉功能子集来确保高帧率,同时对 CPU 和 GPU 使用的影响最小。产生更高质量的实时视频有一些处理开销,但使 ARKit 工作的计算机视觉和运动传感器集成系统也有一些处理开销——开销增加太多,你就会开始增加延迟。对于本应向用户展示 "live" 增强的世界观的技术,您不希望 "augmented" 部分使相机运动滞后多帧。 (此外,最重要的是,您可能需要一些 CPU/GPU 时间让您的应用程序在相机视图上呈现漂亮的 3D 内容。)

iPhone 和 iPad 设备的情况相同,但您在 iPad 上注意到更多,只是因为屏幕大得多 — 720p 视频不在 4-5" 的屏幕上看起来很糟糕,但它看起来很糟糕以填充 10-13" 的屏幕。 (幸运的是你在 iOS 11.3 中默认获得 1080p,应该看起来更好。)

AVCapture 系统确实提供在视频捕获期间拍摄更高分辨率/更高质量的静态照片,但 ARKit 不会以任何方式公开其内部捕获 session,因此您不能使用 AVCapturePhotoOutput 与它。 (在 session 期间捕捉高分辨率静止图像可能仍然是一个很好的 feature request。)

config.videoFormat = ARWorldTrackingConfiguration.supportedVideoFormats[1]

我不得不寻找一段时间如何设置配置,所以也许它会对某些人有所帮助。

这让您可以选择分辨率最高的那个,您可以更改它以使其以大多数 fps 等进行选择...

    if let videoFormat = ARWorldTrackingConfiguration.supportedVideoFormats.sorted { ([=10=].imageResolution.width * [=10=].imageResolution.height) < (.imageResolution.width * .imageResolution.height) }.last{
        configuration.videoFormat = videoFormat
    }