我不熟悉我将在这里描述的问题。对于错误的术语很抱歉。
我正在寻找的是一种算法(最好是C / C ++中的库)来识别曲线的直线部分。输入曲线是使用(x,y)形式的一组有序点定义的。我找到了一些关于Hough变换和一个libray OpenCV的文章。似乎可以使用OpenCV,但看起来有点矫枉过正。我需要的是一种非常有效的算法来处理一条简单的曲线。有什么想法怎么做?感谢。
答案 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