在OpenCV中进行椭圆拟合的度量标准

时间:2012-11-24 12:17:29

标签: image-processing opencv computer-vision

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

然而,它有一些主要缺点,限制了它的用途。例如,它已经需要选定的点,所以我必须自己进行特征提取。 HoughCircles检测到给定图片上的圆圈,可惜没有HoughEllipses

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

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

fitEllipse为椭圆提供cv::RotatedRect,因此您可以知道椭圆的旋转角度,它的中心和两个轴。

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

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

您需要从几何工具引擎的OpenCV cv::RotatedRect转到Ellipse2,然后才能计算距离。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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