OpenCV有一个很好的内置椭圆拟合算法fitEllipse(const Mat& points)
然而,它有一些主要缺点,限制了它的用途。例如,它已经需要选定的点,所以我必须自己进行特征提取。 HoughCircles
检测到给定图片上的圆圈,可惜没有HoughEllipses
。
另一个主要缺点是我的问题的中心,它没有提供关于拟合精度的任何指标。它返回一个最符合给定点的椭圆,即使形状甚至看起来不像椭圆。有没有办法从算法中获得估计的误差?我想用它作为阈值来过滤掉甚至不被认为是椭圆的形状。
我问过这个,因为在我尝试重新发明轮子并编写我自己的fitEllipse
函数之前,可能有一个简单的解决方案。
答案 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(或均值平移),它将椭圆拟合到具有相似颜色的区域。