内在 3x3 矩阵
内在相机矩阵在 2D 相机平面和 3D 世界坐标空间之间转换。这是一个内在矩阵的分解,其中:
-
fx 和 fy 是以像素为单位的焦距
-
xO 和 yO 是以像素为单位的主点偏移
-
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() 方法。