我想获得机器人轨迹的外部(该轨迹的边界)。
我在几篇文章中读到,检索点云边界的最佳方法是使用alpha形状。
所以我使用CGAL的alpha形状实现。
上图抑制:
最佳alpha取决于CGAL documentation的alpha:
如果增加alpha值,则会得到凸包(如预期的那样)。 但是我找不到一个可以给我以下边界(下面是黑色的边界)的alpha:
所以我的问题是:
上图中的黑色形状是否可以归因于以蓝点作为输入的alpha形状?
对于那些想了解如何使用CGAL python绑定生成alpha形状的人,这是我的代码:
def computeAlphaShape(val):
alpha_shape = Alpha_shape_2(points, 10000.0)
it = alpha_shape.find_optimal_alpha(1)
optimal_alpha = it.next()
alpha_shape.set_alpha(val)
print("Optimal alpha : " + str(optimal_alpha) + " current alpha : " + str(val))
if val == 0:
salpha.set_val(optimal_alpha)
return
print("Solid components : " + str(alpha_shape.number_of_solid_components()))
drawResult(alpha_shape)
salpha.on_changed(computeAlphaShape)
def drawResult(alpha_shape):
ax.clear()
ax.plot(X, Y, 'ob')
edges = alpha_shape.alpha_shape_edges()
while edges.hasNext():
eresX = []
eresY = []
edge = edges.next()
segment = alpha_shape.segment(edge)
eresX.append(segment.source().x())
eresY.append(segment.source().y())
eresX.append(segment.target().x())
eresY.append(segment.target().y())
classe = alpha_shape.classify(edge)
color = 'g-'
if classe == EXTERIOR:
color = 'b-'
elif classe == INTERIOR:
color = 'r-'
elif classe == SINGULAR:
color = 'y-'
elif classe == REGULAR:
color = 'c-'
ax.plot(eresX, eresY, color)
vertices = alpha_shape.alpha_shape_vertices()
v_res_x =[]
v_res_y = []
while vertices.hasNext():
vertex = vertices.next()
v_res_x.append(vertex.point().x())
v_res_y.append(vertex.point().y())
ax.plot(v_res_x, v_res_y, '+r')
答案 0 :(得分:1)
对于这样的任务,如果已经有线段并且simplification package是您仅有点,那么我将使用2D reconstruction package。
仅当点的密度均匀时,通过选取所有非外部的边,字母形状才能很好地工作。 Alpha应该是轨迹上两点之间的平方距离(稍微多一点以确保拾取了边)。我什至不知道如果您的某些零件的局部特征尺寸很小,结果如何。在这种情况下,只能选择奇异和规则边缘。