【问题标题】:Do depth values in AVDepthData (from TrueDepth camera) indicate distance from camera or camera plane?AVDepthData(来自 TrueDepth 相机)中的深度值是否表示与相机或相机平面的距离?
【发布时间】:2018-08-20 20:40:39
【问题描述】:

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))

【问题讨论】:

    标签: scenekit ios11 iphone-x


    【解决方案1】:

    无论哪种方式,我都不确定权威信息,但值得注意的是,disparity(不是深度)格式的捕获使用基于针孔相机模型的距离,如 @987654321 中所述@。该课程主要是关于使用后置双摄像头进行基于视差的深度捕捉,但其中的许多课程也适用于 TrueDepth 摄像头。

    也就是说,视差是 1/depth,其中深度是对象到成像平面沿焦轴(垂直于成像平面)的距离。不是说,从被摄体到焦点的距离,或者到被摄体在成像平面上的图像的直线距离。

    IIRC TrueDepth 相机捕捉的默认格式是深度,而不是视差(也就是说,深度图“像素”值是米,而不是 1/米),但缺少 Apple 的声明,假设模型是其他情况可能是安全的一样的。

    【讨论】:

    • TrueDepth 捕获似乎是视差格式,我使用 1/disparity 来查找深度。我有点困惑:深度是沿焦轴从主体到成像平面的距离。您能否在寻找世界 3D 点方面详细说明一下?
    • 是不是说视差值要先通过逆投影矩阵变换?
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 2018-07-10
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      相关资源
      最近更新 更多