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

C++ 如何检测两个3D点云之间的差异?,c++,algorithm,computer-vision,point-cloud-library,C++,Algorithm,Computer Vision,Point Cloud Library,我有两个三维点云使用。一个是参考点云(我们称之为A),另一个是畸形点云(我们称之为B)。这两个点云都是从对象中获取的,这些对象在表面上除了边缘之外没有任何或非常微小的特征。这些点云A和B也对齐 我想知道是否有任何算法可以从B中检测到缺失的云 如何构建B缺失部分的高分辨率三维图像 谢谢你的帮助 我不是这些方面的专家,所以这些大多是想法,而不是解决方案,我可能是错的 但我的天真方法是基于两个网格的布尔运算(另请参见)。如果计算A-B,则得到的网格包含A中的所有内容,但不包含B中的所有内容-或者换

我有两个三维点云使用。一个是参考点云(我们称之为A),另一个是畸形点云(我们称之为B)。这两个点云都是从对象中获取的,这些对象在表面上除了边缘之外没有任何或非常微小的特征。这些点云AB也对齐

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

谢谢你的帮助

我不是这些方面的专家,所以这些大多是想法,而不是解决方案,我可能是错的

但我的天真方法是基于两个网格的布尔运算(另请参见)。如果计算
A-B
,则得到的网格包含A中的所有内容,但不包含B中的所有内容-或者换句话说:B中缺少的部分

不过,这种方法存在两个问题:

  • 由于浮点不准确和特殊情况,布尔运算很棘手
  • 您的网格有噪波,因此它们的曲面大部分不会重合,即使在缺失区域之外也是如此
  • 因此,差分网格将包含实际缺失区域之外的许多小“体积”。您可以通过在布尔运算期间向A添加某种公差半径或对结果应用某种平滑或其他后处理来解决此问题

    另一种方法可能是不在网格上执行布尔运算,而是在从点clounds(例如with)创建的网格上执行布尔运算,然后从生成的隐式函数(例如with)创建网格。这可能是一个更稳健的解决方案


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

    只要两个云都已组织好(您是从Kinect获得的,后者由AFAIK生成组织为规则点网格的云),就可以将它们转换为深度图像。只要你相信云是正确对齐的(你的Kinect是静止的,看着同一个场景),那么你就可以对深度图像使用通常的图像处理技术,包括获取两个图像之间的差异,平滑,使用一些阈值从差异图像创建遮罩图像。获得遮罩图像后,将其应用于B云,将遮罩外的所有点设置为NaNs(如此处)和voila,即B中与A不同的零件的3d图像

    虽然我知道这种方法正在使用,但我自己从未使用过,也从未使用过Kinect。我猜,由于噪音和地面振动小,制作的遮罩可能也太吵了,尤其是在场景的边缘和“轮廓”点,这是应用于深度遮罩的图像处理工具来拯救的地方。

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

    看看这个链接:


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

    该库提供关于点云的哪些数据/属性?隐式函数、体素、网格?感谢您的快速回复。我从Kinect获得了点云,这些是网格。