2012-11-24 58 views
3

OpenCV的所謂fitEllipse(const Mat& points)公制爲橢圓OpenCV中擬合

但是一個很好的內置橢圓擬合算法,它有一些大的缺點,限制了其有效性。例如,它已經需要選定的點,所以我必須自己做一個特徵提取。 HoughCircles檢測到給定圖像上的圓圈,可惜沒有HoughEllipses

另外一個主要的缺點,就是我的問題的核心,就是它沒有提供關於擬合精度的任何度量。它會返回一個最適合給定點的橢圓,即使該形狀甚至不會看起來像橢圓。有沒有辦法從算法中獲得估計的錯誤?我想用它作爲一個閾值來過濾掉甚至沒有被認爲是橢圓的形狀。

我問過這個問題,因爲在我嘗試重新發明輪子並編寫自己的fitEllipse函數之前,可能有一個簡單的解決方案。

+2

橢圓有5個自由度,所以hough變換的參數空間會太大。如果你有很少的異常值,也許RANSAC算法會起作用。 – Niki

回答

3

如果你不介意弄髒你的手,你實際上可以修改fitEllipse()的源代碼。 fitEllipse()函數使用最小二乘來確定可能的橢圓,最小二乘解決方案是一個有形的距離度量,這是你想要的。

如果這是你願意做的事情,這將是一個非常簡單的代碼更改。只需添加一個float值,該值在函數調用後傳回,其中float存儲當前最佳最小二乘值。

0

爲什麼不做一個findContours()來減少所需的內存空間?那裏有你選擇的積分結構。如果你想進一步簡化你可以運行一個ConvexHull()或ApproxPoly()。將橢圓擬合到這些點上,然後我想你可以檢查兩個結構之間的相似性來獲得某種估計。兩個Mats之間的差異運算符會是一個(非常)粗略的估計?

0

根據應用的不同,您可能可以使用CAMShift(或平均偏移),它可以將橢圓擬合到具有相似顏色的區域。

2

fitEllipse爲您提供橢圓形爲cv::RotatedRect,因此您知道橢圓,其中心和兩個軸的旋轉角度。

你可以計算你的點和橢圓之間的距離的平方和,該總和就是你正在尋找的度量。這裏http://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf描述

點和橢圓之間的距離和代碼是在這裏http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistPointHyperellipsoid.h

你需要從OpenCV的cv::RotatedRect去幾何工具引擎Ellipse2,然後你可以計算距離。