【问题标题】:Selecting specific areas in a pointcloud在点云中选择特定区域
【发布时间】:2020-08-25 15:33:42
【问题描述】:

我有这个对象的点云

我想测量棋子所在的平面与标记为红色和蓝色的点之间的距离。我已经有了平面方程,允许我删除与平面对应的点并计算它与点之间的距离。但是我不知道如何选择红点和蓝点,有什么方法可以帮助解决这个问题?

【问题讨论】:

  • 请纠正我的理解。您正在尝试找到您知道方程式的平面与已知点之间的距离。 float distance = dotProduct(planeNormal, pointInPlane - point));
  • 问题在于选择那些特定的点,而不是距离计算本身。

标签: 3d point-cloud-library point-clouds


【解决方案1】:
  1. 如果您的云具有高质量法线,您可以尝试利用子部分之间的不连续性,使用 pcl::RegionGrowing 具有严格的平滑度标准(如果点法线之间的偏差小于平滑度阈值,则建议它们在同一个集群中)。
  2. 如果您知道所有子部分的大小,则可以计算一个定向边界框,然后(大致)切出两个圆形部分。
  3. 如果您不知道大小,则在计算定向边界框(并旋转以使 x 为长轴 - 例如)后,您将 x 值装箱,并为每个 x 计算最小值/max y 值。这应该让您了解它的形状。

无论哪种方式,一旦你有了一个子零件,你就可以计算它的质心,然后计算每个点到中心的距离。这将为您提供半径分布。

  1. 如果您有更精细的子部件(来自上述方法 #1),您可以通过考虑平均半径和最小半径来确定哪个是什么。
  2. 如果您有一个粗略的子零件(来自上面的方法#2/#3),您应该根据半径将点分割为“红色”/“蓝色”。您可能必须反复执行此操作(每次都优化质心)。

【讨论】:

  • 非常感谢您的回复!我想自动化这个过程,所以有什么方法可以在使用区域增长时始终选择相同的区域?还是使用bounding-box方法更好?
  • Region Growing 使用曲率最小的点来确定下一个种子点,因此子区域应该是一致的。你不应该指望他们的订单(他们按大小排序)。您需要遍历所有子区域并对其进行分析(如答案最后一部分中的#1)。假设在您的情况下,法线不连续性确实足够好,我认为这是一个更好的方向。通过引入不同的验证/标准来测试子区域,可以扩展相同的概念,例如子部分的分类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多