相机内在分辨率与真实屏幕分辨率

Posted

技术标签:

【中文标题】相机内在分辨率与真实屏幕分辨率【英文标题】:Camera Intrinsics Resolution vs Real Screen Resolution 【发布时间】:2021-06-27 19:48:54 【问题描述】:

我正在编写一个 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 的图像分辨率,这与原始图像分辨率完全不同。

问题是:

返回的相机内在函数是否属于 1920x1440 图像分辨率? 如果是,如何获得表示原始图像分辨率(即 750x1182)的内在矩阵?

【问题讨论】:

【参考方案1】:

内在 3x3 矩阵

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

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

根据 Apple 文档:

值 fx 和 fy 是像素焦距,对于方形像素来说是相同的。 ox 和 oy 值是主点与图像帧左上角的偏移量。所有值都以像素表示。

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

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

要将已知焦距(以像素为单位)转换为 mm,请使用以下表达式:

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

点分辨率与像素分辨率

查看this post,了解什么是 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)

苹果文档:

imageResolution 实例属性描述了 captureImage 缓冲区中的图像,其中包含相机设备本机传感器方向的图像数据。要转换图像坐标以匹配该图像的特定显示方向,请使用 viewMatrix(for:) 或 projectPoint(_:orientation:viewportSize:) 方法。

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() 方法。

【讨论】:

以上是关于相机内在分辨率与真实屏幕分辨率的主要内容,如果未能解决你的问题,请参考以下文章

WinForm C# 获取屏幕真实分辨率

WinForm C# 获取屏幕真实分辨率

为啥屏幕分辨率和屏幕尺寸比例不一样?

iPhone x屏幕分辨率是多少

Android中如何获取屏幕的分辨率?

Android中如何获取屏幕的分辨率?