0

我们有一个 3d 点云,其中有一些圆柱形状。我们可以以编程方式访问每个点的 (x, y, z) 坐标。

4

3 回答 3

1

您可以使用RANSAC算法。在 Wikipedia 页面中有一个 2D 点云和线的示例。将其扩展到 3D 和圆柱体很容易。

基本上,您从完全确定圆柱体的点云中随机选择最小子集,创建圆柱体的数学模型,然后查看有多少点证实了这种假设(例如,它们与建模圆柱体的距离不超过某个阈值)并且您保留了迄今为止最好的气缸。你这样做了几次。

我认为,对于一个圆柱体,你需要4 5 个点来获得它的半径和主轴矢量。如果是您的情况,那么您可能需要其他点来确定圆柱体的高度。

有一篇文章涉及从五点确定圆柱方程:通过五点的圆柱:计算代数和几何。它还在附录中提供了Mathematica代码,并大量引用了其他文章。

于 2016-04-18T10:07:40.147 回答
0

检查 z 是否在范围内[minz..maxz]

if (z > maxz || z < minz)
  return false;

然后查看该点是否在圆心圆内(centerX,centerY)且半径为R

return ((x-centerX)*(x-centerX) + (y-centerY)*(y-centerY) <= R*R);

这假设圆柱体没有旋转

于 2016-04-18T10:02:02.570 回答
0

概述解决方案:(我们过去使用过类似的解决方案,但我丢失了细节

您基本上需要找到 圆柱体的中心 (C)轴 (n)方向余弦)和半径 (r)

然后对于每个点P,与所需圆柱体和点的偏差(或误差)为(计算点与轴之间的正常距离)。

delta^2 = |(P -C) - (P - C) . n * n|^2 - r^2

我们需要最小化错误。通过使用偏微分和八维向量,我们可以找出对应于最小误差的值。也可以对点进行采样(如果我们知道它们属于同一表面)。

于 2016-04-18T11:06:32.203 回答