3

OpenCV 有一个很好的内置椭圆拟合算法,称为fitEllipse(const Mat& points)

但是,它有一些主要缺点,限制了它的实用性。例如,它已经需要选择点,所以我已经必须自己进行特征提取。HoughCircles检测给定图像上的圆圈,可惜没有HoughEllipses.

另一个主要缺点是我的问题的中心,它没有提供任何关于拟合准确度的指标。它返回一个最适合给定点的椭圆,即使形状看起来甚至不像椭圆。有没有办法从算法中得到估计的误差?我想用它作为一个阈值来过滤掉甚至不接近被认为是椭圆的形状。

我问这个,因为在我尝试重新发明轮子并编写自己的fitEllipse函数之前,也许有一个简单的解决方案。

4

4 回答 4

3

如果你不介意弄脏你的手,你实际上可以修改fitEllipse(). 该fitEllipse()函数使用最小二乘法来确定可能的椭圆,最小二乘法解决方案是有形的距离度量,这正是您想要的。

如果这是您愿意做的事情,那将是一个非常简单的代码更改。只需添加一个浮点数,其值在函数调用后传回,其中浮点数存储当前最佳最小二乘值。

于 2012-11-24T12:23:36.143 回答
2

fitEllipse给你椭圆 a cv::RotatedRect,所以你知道椭圆的旋转角度,它的中心和它的两个轴。

您可以计算点与椭圆之间距离的平方和,该总和是您正在寻找的指标。

点和椭圆之间的距离在此处描述http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf代码在此处http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistPointHyperellipsoid.h

您需要从 OpenCVcv::RotatedRect转到Ellipse2Geometric Tools Engine,然后您可以计算距离。

于 2015-10-19T15:54:59.637 回答
0

你为什么不做一个 findContours() 来减少所需的内存空间?那里有你选择的点结构。如果您想进一步简化,可以在其上运行 ConvexHull() 或 ApproxPoly()。将椭圆拟合到这些点,然后我想您可以检查两个结构之间的相似性以获得某种估计。两个垫子之间的差分算子将是(非常)粗略的估计?

于 2013-06-05T00:38:45.540 回答
0

根据应用程序的不同,您可能可以使用 CAMShift(或均值偏移),它将椭圆拟合到具有相似颜色的区域。

于 2013-06-05T01:27:40.210 回答