AVDepthData(来自TrueDepth摄像机)的深度值是否表示距摄像机或摄像机平面的距离?

时间:2018-03-12 18:07:46

标签: scenekit ios11 iphone-x

AVDepthData中的深度值(来自TrueDepth摄影机)是指距离摄像机的距离(以米为单位),还是距离摄像机的平面的垂直距离(即摄像机空间中的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))

2 个答案:

答案 0 :(得分:2)

我不确定权威信息,但值得注意的是,视差(非深度)格式的捕获使用基于针孔相机模型的距离,如{{ 3}}。该会议主要是关于基于差异的深度捕获与背面双摄像头,但其中的许多课程也适用于TrueDepth摄像头。

即,视差是1 /深度,其中深度是沿着焦轴(垂直于成像平面)从被摄体到成像平面的距离。不是说,从主体到焦点的距离,或与成像平面上主体图像的直线距离。

IIRC TrueDepth摄像头捕获的默认格式是深度,而不是差异(即深度图“像素”值是米,而不是1 /米),但缺少来自Apple的声明,否则假设该模型可能是安全的同样的。

答案 1 :(得分:0)

看起来它测量的是距相机平面的距离,而不是距针孔的直线。您可以通过下载Streaming Depth Data from the TrueDepth Camera示例代码来进行测试。

将手机垂直放置在距离墙壁10英尺的地方,您应该会看到以下内容之一:

  1. 如果从焦点到墙壁的距离为一条直线,则应该看到一个放射状的图案(例如,距离摄像机最近的点在它的前面是笔直的;距离摄像机最远的点是更靠近地板和天花板的那些。)

  2. 如果它测量的是与相机平面的距离,那么您应该期望墙壁的颜色几乎是均匀的(只要您将手机与墙壁平行即可)。

下载示例代码并进行尝试后,您会注意到它的行为类似于#2,这意味着它与相机平面的距离,而不是与相机本身的距离。