1

我正在使用新的 Kinect v2,并且正在获取 Kinect 的深度图。获得深度图后,我将深度数据从深度空间转换为相机空间。据我了解,这是通过将每个像素的所有 X、Y 坐标转换为相机空间 + 将深度值添加为 Z 坐标来完成的(Kinect 也以毫米为单位给出深度值,因此它也被转换为保持米)。正因为如此,点云实际上是在以深度值扩展的 2D 网格上。可视化也证实了这一点,因为由于上述对话,很容易注意到这些点在网格中排序。

对于可视化,我使用 OpenGL 的老式方式(glBegin(...) 和 glEnd())。我想用这些点创建一个网格。我设法用 GL_TRIANGLES 做到了,但是我有很多重复的顶点和边。所以我想我应该用 GL_TRIANGLE_STRIP 创建一个更好的三角剖分,但我被困在这里,因为我无法想出一个好的算法,它可以通过我的 2D 网格以某种方式将它提供给 GL_TRIANGLE_STRIP 所以它创建一个漂亮的表面。

问题:

  • 对于每个三角形的顶点,我正在检查 Z 坐标。如果它超过某个阈值,我会忽略三角形 => 这可能会在我的 2D 网格中创建孔。

  • 一些深度值是 NaN,因为 Kinect 无法“看到”任何东西(例如对象太远或太近)=> 这也会在 2D 网格中创建孔。

有人有什么建议解决这个问题的最佳方法是什么?

4

2 回答 2

1

您也可以尝试 3d 中的 delanauy 三角剖分,并在外部寻找四面体。一个简单的算法是带有四面体和外球面的 Bowyer-watson。Cgal 就是一个很好的例子。

于 2014-11-24T20:55:32.120 回答
1

如果您能够使用点云库,则可以使用类 pcl::OrganizedFastMesh<PointInT>。

http://docs.pointclouds.org/trunk/classpcl_1_1_organized_fast_mesh.html

我用它来三角测量完整的深度帧。

于 2014-12-10T15:07:38.703 回答