AVDepthData(来自 TrueDepth 相机)中的深度值是否表示距相机的距离(以米为单位),或距相机 plane 的垂直距离(即相机空间中的 z 值)?
我的目标是从深度数据中获得准确的 3D 点,这种区别对于准确性非常重要。我在网上找到了很多关于 OpenGL 或 Kinect 的信息,但没有找到关于 TrueDepth 相机的信息。
FWIW,这是我使用的算法。我找到了使用一些 OpenCV 特征检测找到的像素处的深度缓冲区的值。下面是我用来在
let cgPt: CGPoint
给定像素处查找真实世界 3D 点的代码。这个算法似乎工作得很好,但我不确定深度是到相机平面的距离的假设是否会引入小误差。
let depth = 1/disparity
let vScreen = sceneView.projectPoint(SCNVector3Make(0, 0, -depth))
// cgPt is the 2D coordinates at which I sample the depth
let worldPoint = sceneView.unprojectPoint(SCNVector3Make(cgPt.x, cgPt.y, vScreen.z))
无论哪种方式,我都不确定权威信息,但值得注意的是,以“视差”(而非深度)格式进行捕获使用基于针孔相机模型的距离,如“WWDC17 深度摄影会议”中所述。该会议主要是关于使用后置双摄像头进行基于视差的深度捕获,但其中的许多课程也适用于 TrueDepth 摄像头。 即视差为 1/深度,其中深度是沿焦轴(垂直于成像平面)从主体到成像平面的距离。不是指从拍摄对象到焦点的距离,也不是到成像平面上拍摄对象图像的直线距离。 IIRC TrueDepth 相机捕捉的默认格式是深度,而不是视差(即深度图“像素”值是米,而不是 1/米),但由于缺乏 Apple 的声明,因此可以安全地假设模型在其他方面是相同的.
看起来它测量的是距相机平面的距离,而不是距针孔的直线。您可以通过下载
来自原深感相机的流式深度数据