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

Does ARKit consider Lens Distortion in iPhone and iPad?

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

var intrinsics: simd_float3x3 { get }

众所周知,当我们将未失真的 3D 物体放置在镜头真实世界场景中时,Radial Lens Distortion 会极大地影响 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 中可用,我在哪里可以找到它?

虽然没有明确说明,但我确信 ARKit 正在校正非线性镜头失真。镜头失真(和反向失真)查找表存在于 iOS11 中,可通过 AVCameraCalibrationData 获得,但它们不会被 ARKit 公开,大概是因为不需要它们,因为你已经在使用矫正坐标.

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

source

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

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

QR 标记姿势估计

检测到 QR 标记后,您可能想要做的下一件事是从中获取相机姿势。

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

最后标定后得到的是相机矩阵:3x3元素矩阵,焦距和相机中心坐标(a.k.a内参),畸变系数:a包含 5 个或更多元素的矢量,用于模拟相机产生的失真。大多数 iDevices 的校准参数都非常相同。

通过标记角的精确位置,我们可以估计我们的相机和 3D 标记之间的转换 space。此操作称为来自 2D-3D 对应的姿态估计。姿态估计过程在相机和物体之间找到欧几里德变换(仅由旋转和平移分量组成)。

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

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

集成到 Apple 的 ARKit

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

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