识别曲线直线部分的算法[关闭]

Posted

技术标签:

【中文标题】识别曲线直线部分的算法[关闭]【英文标题】:Algorithm to identify the straight portion of a curved line [closed] 【发布时间】:2016-01-04 11:31:18 【问题描述】:

我不熟悉我将在这里描述的问题。很抱歉用错了术语。

我正在寻找的是一种算法(最好是 C/C++ 中的库)来识别曲线中的直线部分。输入曲线是使用一组 (x,y) 形式的有序点定义的。我发现了一些关于霍夫变换和一个库 OpenCV 的文章。似乎可以使用 OpenCV,但看起来有点矫枉过正。我需要的是一种非常有效的算法来处理一条简单的曲线。任何想法如何做到这一点?谢谢。

更新:见下面的例子,目标是识别红色部分 正如一些人指出的那样,直线部分可能并不完全笔直,即我可能需要在这里对偏差进行一些容忍。

【问题讨论】:

你能给我们举个例子吗?它是一组点中的一条线吗?它是一条真正的直线吗?还是近似直线? 不幸的是,SO 是问这类问题的错误地方。虽然我们很乐意帮助您解决围绕此类库进行编码时可能遇到的任何问题,但发现它超出了本网站的范围。 你可以看看here,还有一个C源代码的链接。或者 here 也可以使用 C++ 代码。或here 或here 但是,这个问题对于*** 来说过于宽泛且不清楚。如果您对编程有任何疑问,请尝试更好地了解问题并回来。 如果这是您的输入,您可以简单地找到成对距离足够大的点 【参考方案1】:

计算连续点之间的斜率 O(N)。

如果 3 个连续点在两对之间具有几乎相同的斜率,则这 3 个点几乎在同一条线上(减去舍入误差)。因此,要找到直线,只需寻找斜率几乎相等的连续点部分。您可以一次性通过 O(N) 点。

如果您有很多点,您可能会遇到这样的情况:曲线非常小,以至于小于比较斜率时允许的舍入误差。如果您看到这一点,请添加另一个检查以与直线中的第一个斜率进行比较,以确保您不会复合错误。

如果您需要更全面或更快速的内容,请考虑使用 OpenCV。

【讨论】:

谢谢 Sorin,我会先试试这个简单的方法,看看我是否需要给 OpenCV 一个机会【参考方案2】:

假设您有 3 个连续点 (x1,y1)(x2,y2)(x3,y3)

计算(y1-y2)*(x3-x2) + (x2-x1)*(y3-y2)

如果为正,则曲线在(x2,y2) 处左转,如果为负,则曲线右转。如果为零,则曲线在(x2,y2)处是直线

要找到真正的直线部分,您可以查找该值为零的点。你可能真的很想找到它从左转右转的地方。

如果你想实际测量它的转动量,那么除以length(segment1)*length(segment2),结果就是转动角度的sin。

【讨论】:

【参考方案3】:

我不知道为什么我在那些日子里对RANSAC产生了无尽的爱。我什至尝试在烹饪时使用它。但是,RANSACfit-line 模型可能是解决您问题的最佳方案。因为你有很多异常值(非直线点)并且你有一个很好的内点(直线点)。在这里,您可以找到 C++ 中的现成实现。 RANSAC-like implementation for arbitrary 2D sets

【讨论】:

以上是关于识别曲线直线部分的算法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

西方经济学。如果需求曲线是线性的(一条直线),那么,需求价格弹性上半部分富有弹性,而下半部分缺乏弹性

通过点平滑曲线,仅使用水平、垂直线和固定半径弧

道格拉斯-普克算法(JavaScript实现)

origin中如何做部分数据的直线拟合

在 OpenCV 中识别曲线和直线对象

两个部分之间的曲线弧[关闭]