如何检测两个3D点云之间的差异
How to detect the difference between two 3D point clouds?
我使用点云库有两个3D点云。一个是参考点云(让我们称其为 a ),另一个称其为畸形(我们称之为 b )。这两个点云都取自以某种方式没有表面上没有或非常小的特征的对象,除了边缘。这些点云 a 和 b 也被对齐。
- 我想知道是否有任何算法可以从 b 。 中检测缺失的云
- 如何构建 b 的缺失部分的高分辨率3D图像。
有助于受到赞赏。
有一些"空间更改检测"PCL提供的解决方案
看一下此链接:更改检测
它使用OCTREE结构(从点云构建),并比较两个OCTREES的差异。
我不是这些事情的专家,所以这些主要是想法,而不是解决方案,我可能错了。
,但我天真的方法是基于两个网格的布尔操作/建设性固体几何形状(另请参见Gamedev的此问题)。如果计算A-B
,则获得包含A中的所有内容的网格(es),但不在B-或换句话说:b。
这种方法有两个问题:
- 布尔操作由于浮点不准确和特殊情况而变得棘手。
- 您的网眼很嘈杂,因此即使在缺失区域之外,它们的表面也不是一致的。
结果,差异网格将在实际缺失区域之外包含许多小的"体积"。您可以通过在布尔操作期间向A添加某种耐受性半径或通过对结果进行一些平滑或其他后处理来解决此问题。
另一种方法可能是在网格上执行布尔操作,而是在从点陷入笨拙(例如使用移动最小二乘)创建的隐式函数上,然后从结果的隐式函数(例如带有行进立方体)中创建网格。这可能是一个更强大的解决方案。
要创建网格的图像,只需使用OpenGL或DirectX渲染。
只要您的两个云都组织起来(您从kinect获得了它们,而afaik会产生以正常点网格的组织云),就可以将它们变成深度图像。只要您相信云是正确对齐的(您的kinect是静止的,看同一场景),就可以使用具有深度图像的常规图像处理技术,包括获得两个图像之间的差异,平滑,创建掩码图像从差异图像使用一些阈值。获得掩模图像后,将其应用于b云设置面具外部的所有点(例如此处https://stackoverflow.com/a/17282917/1027013)和voila,voila是B中B中的3D图像与a。
不同尽管我知道这种方法正在使用,但我自己从未使用过,也从未与Kinect一起玩过。我想由于噪音和小地面振动,产生的面膜也可能太嘈杂了,尤其是在现场的边缘和"剪影"点上,这是将图像处理工具应用于深度面具进行营救的地方。
<。- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 无法将结构注册为增强几何体3D点
- 在cuda线程之间共享大量常量数据
- 计算每个维度的两个 3D 矢量之间的角度
- C++ 和 Lua 函数之间的交互与 3D 矢量参数
- 在 3D 骨架系统 DirectX 之间转换
- c++ 从大型数组中读取 3D 坐标并计算它们之间的距离
- C 计算两个3D向量之间的角度(0至360)
- 检查 3D 点是否位于给定的 3D 线上(在两个 3D 点之间)
- C++ 如何计算两个 3D 点之间的弧
- 如何检测两个3D点云之间的差异
- opencv:两个 3D 点云之间的刚性变换
- 计算两个 3D 矢量之间的角度 - 如何实现
- 计算 3D 对象与点之间的角度
- c++在3d数组之间传递双值
- 如何在3D模型格式之间进行转换?(Collada *.到ACIS *.例如Sat)
- 如何获得两个3D矢量之间的角度(俯仰/偏航)为自动瞄准
- 使用pThreads在线程之间共享3D数组
- 求 2 个 3D 点之间的距离