如何使用 C++ 将点拟合到曲线?

Posted

技术标签:

【中文标题】如何使用 C++ 将点拟合到曲线?【英文标题】:How can i fit points to curve using c++? 【发布时间】:2016-01-15 07:12:01 【问题描述】:

图片上有一个椭圆,如下图。

我通过使用 opencv 得到了轮廓的点。但是你可以看到图片,因为分辨率低,轮廓上有一条直线。我怎样才能让它像蓝线一样适合曲线?

【问题讨论】:

您在寻找矢量化算法吗? 【参考方案1】:

解决您的问题的方法之一是将您的形状矢量化(从简单的强度空间移动到矢量空间)。

我不了解该领域的最新技术。但是,根据学校信息,我可以建议此解决方案。

Bezier curves,你可以尝试使用简单的贝塞尔曲线来模拟你的形状。这不是一个很难的操作,你可以在谷歌上搜索几十个。然后,您可以根据需要调整它的大小,然后将其渲染为简单的图像。 请注意,您也可以Splines 代替贝塞尔曲线。


另一种方法会更简单但效率较低。既然你提到了 OpenCV,你可以在点上应用cv::fitEllipse。请注意,这将返回一个包含椭圆的RotatedRect。您可以像这样简单地推断出您的椭圆:

Center = Center of RotatedRect.
Longest Radius = The Line which pass from the center and intersect with the two small sides of the RotatedRect.
Smallest Radius = The Line which pass from the center and intersect with the two long sides of the RotatedRect.

获得椭圆参数后,您可以根据需要调整其大小,然后使用cv::ellipse 将其重新绘制成您想要的大小。

我知道这是一个伪答案。但是,我认为每件事都很容易应用。如果您在实施时遇到任何问题,请给我评论。

【讨论】:

感谢您的评论。我将尝试样条曲线和贝塞尔曲线。我曾经问过我朋友这个问题。他告诉我最小二乘曲线拟合是解决我的问题的好方法。我不确定样条线、贝塞尔曲线和最小二乘法,这在我的情况下是最好的。

以上是关于如何使用 C++ 将点拟合到曲线?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scikit-learn 将多项式曲线拟合到数据中?

如何使用 LMfit 将曲线拟合到双高斯/偏斜高斯

如何在 MATLAB 中将指数曲线拟合到阻尼谐波振荡数据?

如何使用两个独立变量将拟合数据曲线拟合到已知公式?

如何使用 pylab 和 numpy 将正弦曲线拟合到我的数据中?

最小二乘曲线拟合的C++实现