c++ - 如何连接曲线的两部分并获得连接曲线的点位置?

标签 c++ opencv curve-fitting bezier

我有两部分曲线。曲线的点 position(x,y) 已知。如何连接它们并得到连接曲线的位置?这里有一个类似的问题。 similar question 他说要用贝塞尔曲线。但在我看来,通常情况下,拟合曲线不会通过控制点。所以如果我从曲线的两部分中选择一些点作为控制点,拟合结果可能如下图所示。那不是我的目标。有人可以给我一些建议吗?

enter image description here

enter image description here

最佳答案

使用 Catmull-Rom 曲线,它与 Bezier 曲线相关并且易于转换为 Bezier 形式,其好处是“通过”点,而不是仅仅被它们控制。有关详细信息,请参阅 http://pomax.github.io/bezierinfo/#catmullconv ,但我们基本上需要这两个端点,以及曲线外的两个点,以确保我们在曲线上的两个点处有正确的切线:

enter image description here

p2 和 p3 是“你的”点,p1 和 p4 有点随意:我们只需要确保线 p1--p3 平行于 p2 处的切线(切线和它的平行线以蓝紫色表示),类似地,线 p2--p4 平行于 p3 处的切线(切线及其平行线以粉红色表示)。一个通常简单的方法是只project points p2 and p3 onto the parallel lines .

只要我们确定这是真的,我们就可以将连接线段形成为曲线坐标为 (p1,p2,p3,p4) 的 Catmull-Rom 线段。但是,如果没有 Catmull-Rom 绘图基元,我们可以通过使用以下三次贝塞尔曲线坐标将其简单地绘制为贝塞尔曲线:

  1. 起点:p2
  2. 控制点 1:p2 + (p3-p1)/(6*t)
  3. 控制点 2:p3 - (p4-p2)/(6*t)
  4. 终点:p3

这里的t值是Catmull-Rom曲线的张力;你做得越高,连接看起来越“紧密”(在大多数支持 Catmull-Rom 的图形上下文中默认张力只是 1)。

一些示例值:

enter image description here

请注意,在每个示例中,点 p2 和 p3 处的切线方向都保留了下来,但是切线 vector 的长度 不同,导致拟合非常紧、很好、太松。

关于c++ - 如何连接曲线的两部分并获得连接曲线的点位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894837/

相关文章:

c++ - auto_ptr_ref 实现问题

c++ - 为什么 atoi 函数不能将 const char * 转换为 int?

opencv - [OpenCV]如何将轮廓固定为矩形?

python - 返回Python中拟合系数以便在其他语言中使用的最有效方法?

r - 在R中的图形上绘制对数曲线

python - 如何在 Python 中应用分段线性拟合?

c++ - 使用 CMake 创建和使用库

c++ - 成员函数无法访问私有(private)变量未在范围类中声明

opencv - 多线程 - openCV (imshow) - QMetaMethod 错误

Python OpenCV solvePnP 转换为欧拉角