如何检测两个3D点云之间的差异?

时间:2014-01-29 14:20:00

标签: c++ algorithm computer-vision point-cloud-library

我使用Point Cloud Library有两个3D点云。一个是参考点云(我们称之为 A )而另一个是畸形(让我们称之为 B )。两个点云都取自物体,除了边缘之外,它们在某种程度上在表面上没有或具有非常微小的特征。 A B 这些点云也是对齐的。

  • 我想知道是否有任何算法可以从 B 中检测到丢失的云。
  • 如何构建 B 缺失部分的高分辨率3D图像。

非常感谢。

3 个答案:

答案 0 :(得分:3)

PCL提供了一些“空间变化检测”解决方案。

请看这个链接:change detection

它使用八叉树结构(从点云构建)并比较两个八叉树的差异。

答案 1 :(得分:1)

我不是这些东西的专家,所以这些主要是想法,而不是解决方案,我可能错了。

但我的天真方法是基于两个网格的布尔运算/ constructive solid geometry(另请参阅this question at gamedev)。如果你计算A-B,你得到的网格包含A中的所有内容,但不包含在B中 - 换句话说:B中缺少的部分。

但这种方法存在两个问题:

  1. 由于浮点不准确和特殊情况,布尔运算很棘手。
  2. 你的网眼很吵,所以即使在失踪地区之外,它们的表面也不会重合。
  3. 因此,差异网格将在实际缺失区域之外包含许多小“体积”。您可以通过在布尔操作期间向A添加某种公差半径或者对结果应用一些平滑或其他后处理来解决此问题。

    另一种方法可能是不对网格进行布尔运算,而是对从点clounds创建的implicit functions进行布局操作(例如使用moving least squares),然后从结果隐式函数创建网格(例如与marching cubes)。这可能是一个更强大的解决方案。

    要创建网格图像,只需使用OpenGL或DirectX渲染它。

答案 2 :(得分:0)

只要你的云都是有组织的(你从Kinect那里得到它们,AFAIK产生的云组织为常规点网格)你可以将它们变成深度图像。只要您相信云正确对齐(您的Kinect静止,查看同一场景),您就可以使用常用的图像处理技术和深度图像,包括获取两个图像之间的差异,平滑,创建蒙版图像从差异图像使用一些阈值。获得蒙版图像后,将其应用到B云,将蒙版外的所有点设置为NaN(如此https://stackoverflow.com/a/17282917/1027013),然后是B中与A不同的部分的三维图像。

虽然我知道这种方法正在使用,但我从未使用过它,也从未使用过Kinect。我想由于噪音和小的地面振动,所产生的面罩也可能太嘈杂,特别是在场景的边缘和“轮廓”点,这是应用于深度面罩的图像处理工具来拯救。