如何通过点云拟合曲线? OpenCV/C++

How to fit curve through cloud of points? OpenCV/C++

简单的问题。如何像人类一样通过所有这些点绘制曲线?

我的示例输入图像在这里:

你有很多选择。

1) 如果像示例中的点大部分位于一条直线上,最简单的方法是使用形态学变换 (http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html)。例如,如果你使用闭合(即扩张和腐蚀),你将首先通过扩张使点变大(这样它们就会相互接触),然后你将腐蚀(这样它们就会回到原来的状态)大小,同时仍然相互接触)。那可以模仿一条线。

2) 您可以使用 OpenCV 的 fitLine 函数,它可以将一条线拟合到 2D 或 3D 集。 (http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html)

3) 可以逐点加入。但是为此,您需要猜测线段的方向,并相应地对点进行排序。可以使用OBB(oriented bounding box)结构来保存属于某些线段的点,然后使用OBB的主导轴作为线段。

正如ilke444所说,我会使用形态闭运算,甚至扩张几次然后使用'skeleton'运算符。

在你有一条漂亮的细线之后,我想你想要一个连续的轮廓,不一定是直的line.so你可能想使用ApproxPolyDPhttp://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#approxpolydp

它returns一个描述轮廓的点列表,你可以设置它的精度。