识别曲线直线部分的算法

时间:2016-01-04 11:31:18

标签: c++ algorithm opencv

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

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

更新:请参阅下面的示例,目标是识别红色部分enter image description here
正如一些人所指出的那样,直的部分可能不是直的,即我可能需要一些偏差容差。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

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

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

如果这是肯定的,那么曲线在(x2,y2)左转,如果它是负的,那么它向右转。如果它为零,则曲线在(x2,y2)

处是直的

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

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

答案 2 :(得分:2)

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