【发布时间】:2018-10-31 15:46:35
【问题描述】:
我想获取机器人轨迹的外部部分(该轨迹的边界)。
我在几篇文章中读到,检索点云边界的最佳方法是使用 alpha 形状。
所以我使用了 CGAL 的 alpha 形状实现。
上图压制:
- 蓝点:机器人轨迹
- 红十字:最佳 alpha 形状的顶点
- 青色边缘:最佳 alphashape 的边缘。
最佳阿尔法是根据CGAL documentation 的阿尔法:
- 所有数据点要么位于边界上,要么位于 alpha 形状正则化版本的内部。
- alpha 形状的实体分量数等于或小于 1。
如果我增加 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')
【问题讨论】:
标签: cgal