我正在编写一个ARKit应用程序,我需要使用相机的姿势和内在的三维重建。
ARKit返回的相机Intrinsics矩阵似乎使用了与移动屏幕分辨率不同的图像分辨率。下面是这个问题的一个例子
[[1569.249512, 0, 931.3638306],[0, 1569.249512, 723.3305664],[0, 0, 1]]
而输入图像分辨率为750 (宽)x 1182 (高度)。在这种情况下,主要的观点似乎是不可能的图像。理想情况下,它应该靠近图像中心。因此,上述固有矩阵可能是使用1920年(宽度)x 1440 (高度) 返回的图像分辨率,与原始图像分辨率完全不同。
问题如下:
发布于 2021-04-06 13:32:42
本质3x3矩阵
本质摄像机矩阵在二维摄像机平面和三维世界坐标空间之间进行转换。下面是一个内在矩阵的分解,其中:

fx和fy是以像素为单位的焦距。xO和yO是以像素为单位的主点偏移量。s是一个轴斜根据苹果公司的文件:
fx和fy值是像素焦距,对于平方像素是相同的。值ox和oy是图像帧左上角主点的偏移量。所有的值都以像素表示。
所以让我们来看看你的数据是什么:
[1569, 0, 931]
[ 0, 1569, 723]
[ 0, 0, 1] fx=1569,fy=1569xO=931,yO=723s=0若要将已知的焦距(以像素为单位)转换为mm,请使用以下表达式:
F(mm) = F(pixels) * SensorWidth(mm) / ImageWidth(pixels)点分辨率与像素分辨率
看看这个职位,找出什么是点雷兹和什么是像素。
让我们探讨一下在使用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实例属性描述capturedImage缓冲区中的图像,该缓冲区在相机设备的本机传感器方向中包含图像数据。若要转换图像坐标以匹配该图像的特定显示方向,请使用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 columniPhone X viewportSize (screenSize的第九部分):
(375.0, 812.0)iPhone X screenSize (在技术规范中声明的决议):
(1125.0, 2436.0)注意,RealityKit的ARView没有ARView方法。
https://stackoverflow.com/questions/66893907
复制相似问题