CGAL:我可以使用Alpha形状简化路径吗?

时间:2018-10-31 15:46:35

标签: cgal

我想获得机器人轨迹的外部(该轨迹的边界)。

我在几篇文章中读到,检索点云边界的最佳方法是使用alpha形状。

所以我使用CGAL的alpha形状实现。

enter image description here

上图抑制:

  • 蓝点:机器人轨迹
  • 红十字:最佳alpha形状的顶点
  • 青色边缘:最佳字母形状的边缘。

最佳alpha取决于CGAL documentation的alpha:

  • 所有数据点都在alpha形状的正则化版本的边界上或内部。
  • alpha形状的固体成分的数量等于或小于1。

如果增加alpha值,则会得到凸包(如预期的那样)。 但是我找不到一个可以给我以下边界(下面是黑色的边界)的alpha:

enter image description here

所以我的问题是:

上图中的黑色形状是否可以归因于以蓝点作为输入的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')

1 个答案:

答案 0 :(得分:1)

对于这样的任务,如果已经有线段并且simplification package是您仅有点,那么我将使用2D reconstruction package

仅当点的密度均匀时,通过选取所有非外部的边,字母形状才能很好地工作。 Alpha应该是轨迹上两点之间的平方距离(稍微多一点以确保拾取了边)。我什至不知道如果您的某些零件的局部特征尺寸很小,结果如何。在这种情况下,只能选择奇异和规则边缘。