2014-11-24 51 views
1

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

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

的问题:

  • 对于每一个三角形的顶点,我检查Z坐标。如果超过了某个阈值,我会忽略这个三角形=>这可能会在我的2D网格中产生空洞。

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

有人有任何建议什么是解决此问题的最佳方法?

+1

首先转储所有不添加任何相关内容的顶点(即,它们在深度上彼此几乎不同),然后制作网格。快速谷歌点云优化网格返回http://meshlabstuff.blogspot.co.uk/2009/09/meshing-point-clouds.html。只要知道,当涉及到这类东西时,很少会有一种实现只是为了您的选择语言而浮动,而是必须阅读白皮书和其他语言解决方案,并从那里构建您自己的实现。这是一篇有趣的看文章http://cdn.intechopen.com/pdfs-wm/30515.pdf – 2014-11-24 15:45:54

+0

您好Steve,感谢您的评论。我一定会阅读你提供的链接。作为第一个龟头,他们看起来很有前途! 我认为可能有这种情况下的算法,其中点云实际上坐落在二维网格上,但我想你所提到的那只是一个乐观的希望! :) – Silex 2014-11-24 16:48:03

+0

那么你仍然希望输出是一个3d模型,所以网格实际上是误导性的,因为你需要使最平滑边缘的顶点而不是那些最好与网格对齐的顶点。白皮书专门处理外观上的二维点云,因为它们的样本是从单个相机拍摄的。祝你好运! – 2014-11-24 19:49:15

回答

1

你也可以尝试在三维delanauy三角测量,并寻找外部的四面体。一个简单的算法是具有四面体和环面的bowyer-watson。 Cgal就是一个很好的例子。