相机固有分辨率与实际屏幕分辨率

Camera Intrinsics Resolution vs Real Screen Resolution

我正在编写一个 ARKit 应用程序,我需要在其中使用相机姿势和内在函数进行 3D 重建。

ARKit 返回的相机 Intrinsics 矩阵似乎使用了与移动屏幕分辨率不同的图像分辨率。下面是这个问题的一个例子

Intrinsics matrix returned by ARKit is :

[[1569.249512, 0, 931.3638306],[0, 1569.249512, 723.3305664],[0, 0, 1]]

而输入图像分辨率为 750(宽)x 1182(高)。在这种情况下,主要点似乎在图像之外,这是不可能的。理想情况下,它应该靠近图像中心。因此,上面的固有矩阵可能使用的图像分辨率为 1920(宽度)x 1440(高度)returned,这与原始图像分辨率完全不同。

问题是:

内在 3x3 矩阵

Intrinsics 相机矩阵在 2D 相机平面和 3D 世界坐标之间转换 space。这是内在矩阵的分解,其中:

  • fxfy焦距 以像素为单位
  • xOyO 主点偏移 以像素为单位
  • s 轴倾斜

根据 Apple 文档:

The values fx and fy are the pixel focal length, and are identical for square pixels. The values ox and oy are the offsets of the principal point from the top-left corner of the image frame. All values are expressed in pixels.

所以你让我们检查一下你的数据是什么:

[1569,     0,    931]
[   0,  1569,    723]
[   0,     0,      1] 
  • fx=1569fy=1569
  • xO=931yO=723
  • s=0

要将以像素为单位的已知焦距转换为毫米,请使用以下表达式:

F(mm) = F(pixels) * SensorWidth(mm) / ImageWidth(pixels)


点分辨率与像素分辨率

查看 了解什么是 Point Rez 和什么是 Pixel Rez。

让我们探讨一下使用 iPhoneX 数据时的情况。

@IBOutlet var arView: ARSCNView!

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        
    let imageRez = (self.arView.session.currentFrame?.camera.imageResolution)!
    let intrinsics = (self.arView.session.currentFrame?.camera.intrinsics)!
    let viewportSize = self.arView.frame.size
    let screenSize = self.arView.snapshot().size
                    
    print(imageRez as Any)
    print(intrinsics as Any)
    print(viewportSize as Any)
    print(screenSize as Any)
}

Apple 文档:

imageResolution instance property describes the image in the capturedImage buffer, which contains image data in the camera device's native sensor orientation. To convert image coordinates to match a specific display orientation of that image, use the viewMatrix(for:) or projectPoint(_:orientation:viewportSize:) method.

iPhone X imageRez(纵横比为4:3)。

这些纵横比值对应于相机传感器值:

(1920.0, 1440.0)

iPhone X intrinsics:

simd_float3x3([[1665.0, 0.0, 0.0],     // first column
               [0.0, 1665.0, 0.0],     // second column
               [963.8, 718.3, 1.0]])   // third column

iPhone X viewportSize (screenSize 的第九部分):

(375.0, 812.0)

iPhone X screenSize(技术规范中声明的分辨率):

(1125.0, 2436.0)

注意,RealityKit 的 ARView.

没有 snapshot() 方法