【问题标题】:How to detect the difference between two 3D point clouds?如何检测两个 3D 点云之间的差异?
【发布时间】:2014-01-29 14:20:00
【问题描述】:

我有两个使用 Point Cloud Library 的 3D 点云。一个是参考点云(我们称之为A),另一个是畸形的(我们称之为B)。两个点云都是从表面上没有或非常微小的特征(边缘除外)的物体中获取的。这些点云 AB 也是对齐的。

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

感谢您的帮助。

【问题讨论】:

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

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


【解决方案1】:

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

看看这个链接:change detection

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

【讨论】:

    【解决方案2】:

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

    但我的幼稚方法是基于两个网格的布尔运算/constructive solid geometry(另见this question at gamedev)。如果你计算A-B,你会得到一个网格,它包含 A 中的所有内容,但 B 中没有 - 或者换句话说:B 的缺失部分。

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

    1. 由于浮点不准确和特殊情况,布尔运算很棘手。
    2. 您的网格很嘈杂,因此它们的表面大多不会重合,即使在缺失区域之外也是如此。

    因此,差异网格将在实际缺失区域之外包含许多小“体积”。您可以通过在布尔运算期间向 A 添加某种公差半径或对结果应用一些平滑或其他后处理来解决此问题。

    另一种方法可能是不在网格上执行布尔运算,而是在从点云创建的implicit functions(例如使用moving least squares)上执行布尔运算,然后从生成的隐式函数创建一个网格(例如使用marching cubes )。这可能是一个更强大的解决方案。

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

    【讨论】:

      【解决方案3】:

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

      虽然我知道这种方法正在使用,但我自己从未使用过它,也从未玩过 Kinect。我猜由于噪声和小的地面振动,生成的蒙版可能也太嘈杂了,尤其是在场景的边缘和“剪影”点,这是应用到深度蒙版的图像处理工具来拯救的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 2019-08-20
        • 2021-04-27
        • 2013-06-18
        • 2018-07-17
        • 2017-04-11
        相关资源
        最近更新 更多