我们有一个 3d 点云,其中有一些圆柱形状。我们可以以编程方式访问每个点的 (x, y, z) 坐标。
3 回答
您可以使用RANSAC算法。在 Wikipedia 页面中有一个 2D 点云和线的示例。将其扩展到 3D 和圆柱体很容易。
基本上,您从完全确定圆柱体的点云中随机选择最小子集,创建圆柱体的数学模型,然后查看有多少点证实了这种假设(例如,它们与建模圆柱体的距离不超过某个阈值)并且您保留了迄今为止最好的气缸。你这样做了几次。
我认为,对于一个圆柱体,你需要4 5 个点来获得它的半径和主轴矢量。如果是您的情况,那么您可能需要其他点来确定圆柱体的高度。
有一篇文章涉及从五点确定圆柱方程:通过五点的圆柱:计算代数和几何。它还在附录中提供了Mathematica代码,并大量引用了其他文章。
检查 z 是否在范围内[minz..maxz]
if (z > maxz || z < minz)
return false;
然后查看该点是否在圆心圆内(centerX,centerY)
且半径为R
:
return ((x-centerX)*(x-centerX) + (y-centerY)*(y-centerY) <= R*R);
这假设圆柱体没有旋转
概述解决方案:(我们过去使用过类似的解决方案,但我丢失了细节)
您基本上需要找到 圆柱体的中心 (C)、轴 (n)(方向余弦)和半径 (r)。
然后对于每个点P,与所需圆柱体和点的偏差(或误差)为(计算点与轴之间的正常距离)。
delta^2 = |(P -C) - (P - C) . n * n|^2 - r^2
我们需要最小化错误。通过使用偏微分和八维向量,我们可以找出对应于最小误差的值。也可以对点进行采样(如果我们知道它们属于同一表面)。