【问题标题】:CGAL : Can I use alpha shape to simplify a path?CGAL:我可以使用 alpha 形状来简化路径吗?
【发布时间】: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


    【解决方案1】:

    对于这样的任务,我会使用 simplification package 如果已经有段,而 2D reconstruction package 是你只有积分。

    只有当点的密度是均匀的时,Alpha 形状才能很好地工作,方法是选择所有不是外部的边缘。 Alpha 应该是轨迹上 2 个点之间的平方距离(稍微多一点以确保选择边缘)。如果您有一些局部特征尺寸较小的部分,我什至不确定会产生什么结果。在这种情况下,只应选择 SINGULAR 和 REGULAR 边。

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2014-11-22
      • 2013-04-01
      • 2023-03-19
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多