kinect 中的深度相机有多精确?
- 范围?
- 解析度?
- 噪音?
特别想知道:
- 微软有没有关于它的官方规格?
- 有没有关于这个主题的科学论文?
- 来自 TechBlogs 的调查?
- 易于复制的个人实验?
我现在正在收集大约一天的数据,但大多数作者没有说出他们的来源,而且价值似乎有很大不同......
有来自传感器开发人员的官方规格,而不是来自微软。还没有我知道的科学论文。大量的调查和实验(见谷歌)。OpenKinect目前对这些事情的讨论比这个站点要多得多。
Kinect for Windows SDK 提供了一些我一直在使用的常量,并且似乎是一致的。对于range和resolution,这些值为:
在默认模式下:
在近距离模式下:
对于彩色相机,您可能具有以下任一分辨率:
对于深度相机,您可能具有以下任一分辨率:
面对来自Avada Kedavra的信息(顺便说一下,来自大多数来源), API 给出的视野值如下:
对于彩色相机:
对于深度相机:
这里真正的问题是关于分辨率和精度。我想在这里插话,因为我发现分辨率和精度不如所说的那么好。深度分辨率的最大输出确实是 640x480,然而,这不是有效的分辨率,也不是它的精确度。
kinect 工作的方法是基于结构光投影。一种光的图案被发射并投射到表面上,相机看到它,然后对从原点、从物体反弹到相机的每条光线进行三角测量。
问题是这种模式仅包含 34.749 个可以进行三角测量的亮点( http://azttm.wordpress.com/2011/04/03/kinect-pattern-uncovered/ )。如果我们将其与 640x480=307.200 数据点的分辨率相关联,我们会注意到很大的差异。问问自己,10 倍于源数据点数量的数据量是否可以被视为有效并且有效地采样。我对此表示怀疑。如果你要问我 kinect 的有效分辨率是多少,我猜它大约是240x180的诚实且相当不错的数据。
根据Kinect 技术规范最终透露的深度场规范是(这些匹配也在 Mannimarco 发布的官方编程指南中得到确认):
* Horizontal field of view: 57 degrees
* Vertical field of view: 43 degrees
* Physical tilt range: ± 27 degrees
* Depth sensor range: 1.2m - 3.5m
* Resolution depth stream: 320x240 pixels
* Resolution color stream: 640x480 pixels
但是根据我自己的经验,深度传感器的范围更像是0.8m-4.0m
,至少我在这个范围内得到了很好的读数。该范围与 mankoff 在下面的评论中发布的 Primesense 数据表相匹配。
同样重要的是要记住,靠近传感器的深度分辨率远高于远离传感器的深度分辨率。在 3-4 米处,分辨率不如 1.5m 处好。例如,如果您想要计算曲面的法线,这将变得很重要。靠近传感器的结果会比远离传感器的效果更好。
自己测试范围并不难。当您超出范围时,官方 SDK(当前为测试版)将为您提供零 (0) 深度。所以,你可以用一个简单的尺子来测试它,并测试你得到/不得到任何大于零的读数的距离。我不知道 OpenKinect SDK 如何处理超出范围的读数。
关于噪音的评论:我会说深度流中有相当多的噪音,这使得它更难处理。例如,如果您计算表面法线,您可以期望它们有点“跳跃”,这当然会对假照明等产生负面影响。此外,由于 IR 发射器之间的距离,您在深度流中存在视差问题和接收器。这也很难处理,因为它会在深度数据中留下很大的“阴影”。此 youtube 视频演示了该问题并讨论了使用着色器解决该问题的方法。它是一个值得观看的视频。
我认为值得一提的是 Khoshelham 和 Elbernik 的论文,他们确实在 2012 年 2 月提出了 kinects 深度传感器的理论随机误差模型。它被称为“用于室内测绘应用的 Kinect 深度数据的准确性和分辨率”。论文可以在这里找到。
如果您正在寻找 Microsoft 发布的内容,请查看Kinect 编程指南的第 11 页。它说的几乎和这里的每个人已经提到的一样。
我没有看到任何提到噪音的东西,但我可以说它非常小,除了沿着表面边缘会变得更加明显。
我的经验是,它并不那么准确。这很好,但是当你将它与卷尺进行比较时,它并不完全匹配。我制作了一个 Excel,每 10 毫米测量一次,但它就是不支持,尤其是距离超过 2500 毫米但也更近的东西。
还要记住,实际深度像素比宣传的要低很多。里面的电子设备会让人喘不过气来,这就是为什么你会看到小面积的伪影,而不是像像素数据这样的东西。本质上,这意味着 320x240 有 1/8 像素被“真实”测量覆盖,其他像素被计算出来。所以你可以使用 640x480;但它只会占用 CPU/UBS 资源,不会让您的应用程序看起来更好。
这只是我的两分钱经验,我正在编程机器人。