【问题标题】:Simplify a convex hull简化凸包
【发布时间】:2016-11-19 14:27:24
【问题描述】:

我的问题如下: 我有一个凸包,看起来像这样:

我想将显着接近的点组合在一起以用某种形式的平均表示,例如平均值或中点。

我更专注于如何进行分组。

如何以系统的方式执行此分组?

我知道这似乎是一个非常简单的问题,答案很明显。我的主要问题是试图解决这个问题,我最终遇到了一些极端情况,例如答案会根据我在船体上的开始位置而改变。例如,如果我从红线开始顺时针工作,我最终会得到(如果我没有尝试抓住角落案例):

我对此进行了多次尝试,每次重新考虑我的想法时,我都会得到一个感觉笨拙的新角落案例。我习惯于寻找最不直观的方法来解决问题,所以我认为最好问问社区。我现在遇到的问题的一个比较示例是,我被要求在排序数组中查找一个元素,我最初执行的是线性搜索,我有一种直觉,那里有更好的东西。

我无法通过研究找到我想要的确切内容。我发现船体简化了算法,但它改变了船体的形状太多,这不符合我的程序目标。

我将在最后添加一条注释,说明我正在使用 OpenCV 和 C++ 在我正在处理的项目中生成凸包。以防万一这是一个值得一提的细节(以及为什么我将 OpenCV 添加为标签)。

【问题讨论】:

    标签: algorithm opencv


    【解决方案1】:

    考虑使用Douglas–Peucker algorithm

    它旨在简化多段线,丢弃不太重要的点。

    感谢 Berriel 的补充:在 OpenCV 中实现:approxPolyDP

    【讨论】:

    • 并且已经在OpenCV中实现了:approxPolyDP()
    • 亲爱的@MBo,approxPolyDP 是否确保原始船体的内部没有丢失?我可以保证它只会扩大船体而不是从船体上切开吗?
    • @Michael Sohnen 此函数删除部分旧顶点,因为文档说它使用 Douglas Peucker 算法
    • 有没有除了消除旧顶点之外还会添加新顶点的版本?
    • @Michael Sohnen 抱歉,我不知道。该方法旨在删除最大数量的点,因此添加过多的点会很奇怪。也许确实存在另一种算法来制作新的折线而不使用旧点(如线性最小二乘法来近似一条线段)
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2018-12-29
    • 2013-10-09
    • 2018-11-21
    相关资源
    最近更新 更多