ARKit 是不是考虑 iPhone 和 iPad 中的镜头失真?

Posted

技术标签:

【中文标题】ARKit 是不是考虑 iPhone 和 iPad 中的镜头失真?【英文标题】:Does ARKit consider Lens Distortion in iPhone and iPad?ARKit 是否考虑 iPhone 和 iPad 中的镜头失真? 【发布时间】:2019-02-01 04:33:36 【问题描述】:

ARKit 会逐帧更新 ARCamera 的许多内在(和外在)参数。我想知道它是否也考虑了Radial Lens Distortion(比如在ARKit 不使用的AVCameraCalibrationData 类中),并适当地修复视频帧的失真(distort/undistort 操作)以便返回iPhone 和 iPad 相机?

var intrinsics: simd_float3x3  get 

众所周知,Radial Lens Distortion 在我们将未扭曲的 3D 物体放置在被镜头扭曲的真实世界场景中时,会极大地影响 6 DOF 位姿估计精度。

var lensDistortionLookupTable: Data?  get  

/* A map of floating-point values describing radial */
/* lens distortions in AVCameraCalibrationData class */

如果 ARKit 中的 Lens Distortion's math 在 API 中可用,我在哪里可以找到它?

【问题讨论】:

我也在 GitHub 上找到了这个github.com/eugenebokhan/ARKit-Multiplayer 他设法将镜头畸变考虑在内,但正如他在自述文件中所说,您需要将它们作为每个设备的参数输入 @ADProgress 链接已损坏 :( @wcochran 我已经更新了下面答案中的链接。 【参考方案1】:

虽然没有明确说明,但我确信 ARKit 正在纠正非线性镜头失真。 ios11 中存在镜头畸变(和反畸变)查找表,可通过AVCameraCalibrationData 获得,但它们并未被 ARKit 公开,可能是因为您已经在使用校正坐标,因此不需要它们。

每个设备型号的失真模型参数是否相同(即每个 iPhone 7 的值完全相同)这是一个有趣的问题。我无法使用同一型号的多部手机,但这对于拥有的人来说应该不难弄清楚。

source

例如来自:https://github.com/verebes1/ARKit-Multiplayer QR 标记检测

借助 Apple 的 Vision,现在可以识别摄像头视频源中的 QR 标记并在其处于视野中时对其进行跟踪。该框架为我们提供了屏幕坐标系中 QR 标记方角的坐标。

QR 标记姿态估计

在检测到 QR 标记后,您可能想做的下一件事就是从它们那里获取相机姿势。

要执行 QR 标记姿势估计,您需要知道相机的校准参数。这是相机矩阵和畸变系数。每个相机镜头都有独特的参数,例如焦距、主点和镜头畸变模型。寻找内在相机参数的过程称为相机校准。相机校准过程对于增强现实应用很重要,因为它描述了输出图像上的透视变换和镜头失真。为了通过增强现实获得最佳用户体验,增强对象的可视化应使用相同的透视投影来完成。

最后,校准后得到的是相机矩阵:具有焦距和相机中心坐标(也称为内在参数)的 3x3 元素矩阵,以及失真系数:5 个元素或更多元素的向量模拟相机产生的失真。大多数 iDevices 的校准参数几乎相同。

通过标记角的精确位置,我们可以估计我们的相机和 3D 空间中的标记之间的转换。这个操作被称为从 2D-3D 对应的姿态估计。姿态估计过程会在相机和对象之间找到欧几里得变换(仅包含旋转和平移分量)。

C 用于表示相机中心。 P1-P4 点是世界坐标系中的 3D 点,p1-p4 点是它们在相机图像平面上的投影。我们的目标是使用固有矩阵和图像平面上的已知点投影 (P1-P4) 找到 3D 世界中已知标记位置 (p1-p4) 与相机 C 之间的相对变换。

OpenCV 函数用于计算 QR 标记变换,使其最小化重投影误差,即观察投影的 imagePoints 和投影 objectPoints 之间的平方距离之和。估计的变换由旋转 (rvec) 和平移分量 (tvec) 定义。这也称为欧几里得变换或刚性变换。最后我们得到旋转四元数和QR标记的平移矩阵。

集成到 Apple 的 ARKit

最后一部分是将有关 QR 标记的姿势的所有信息集成到 ARKit 创建的 3D 场景中。 ARKit 使用视觉惯性里程计 (VIO) 来准确跟踪周围的世界。 VIO 将相机传感器数据与 CoreMotion 数据融合在一起。这两个输入允许设备以高精度感应它在房间内的移动方式,而无需任何额外的校准。所有的渲染东西都是基于 Apple 的 Metal 和上面的 Apple 的 SceneKit。

为了以正确的方式在我们的 QR 标记上渲染 SceneKit 的节点,我们需要从我们从 OpenCV 获得的四元数和平移矩阵创建我们的 QR 标记的模型矩阵。下一步是将 QR 标记的模型矩阵乘以 SceneKit 场景虚拟相机的变换矩阵。结果,我们可以看到一个自定义节点(我们项目中的 Axes 节点)在 iPhone 摄像头的视野中重复所有 QR 标记在现实世界中的移动,如果不是 - 它停留在最后一个更新了位置,以便我们检查它。

【讨论】:

你如何确定 iphone 7 中的失真参数? AVCameraCalibrationData 仅适用于双摄像头设备。 我最初做了同样的假设,即在使用这些帧将图像配准到 SfM 重建时,ARKit 帧已经“不失真”。很明显,如果我解决框架上的轻微镜头失真(单个径向系数),我会得到更好的结果。我确实发现内在价值是正确的。当然,这是对使用 Apple API 的爱/恨的一部分——它们使用起来非常优雅,但内部细节不透明。

以上是关于ARKit 是不是考虑 iPhone 和 iPad 中的镜头失真?的主要内容,如果未能解决你的问题,请参考以下文章

开发 iPhone/iPad 应用程序时要考虑的 iOS 版本

ARKit 3.5 – 如何使用 LiDAR 从新 iPad Pro 导出 OBJ?

不同 iPhone 上的 ARKit

ARKit 演示在 iPhone 6/iPhone 6 Plus 上崩溃

自定义iPhone和iPad macOS风格的通知

Web 推送通知 FCM 是不是可以在 iPhone 和 iPad 设备上使用?