2012-10-19 56 views
1

我正在嘗試使用opencv檢測圖像中的橢圓。我找到了包括橢圓和其他一些輪廓。如何檢查輪廓是否爲橢圓?

任何建議,我該如何檢查哪些輪廓是橢圓?

+0

你可以更具體地說你的意思是「大約」嗎? – mathematician1975

+0

@ mathematician1975,我已經上傳了圖片,以及我認爲大概是有點太多了,我會改變它!謝謝 – Shan

+0

[OpenCV的橢圓檢測]可能的重複(http://stackoverflow.com/questions/10982988/ellipse-detection-with-opencv) – ArtemStorozhuk

回答

3

如果我正確地理解了你,你已經檢測到輪廓,其中一些是橢圓,有些不是,你希望能夠決定哪些是橢圓。這樣對嗎? 如果是,我會建議使用cv::fitEllipse()。該文檔說,它適合一個橢圓的點向量,所以R平方很小。不幸的是,該函數不會顯式返回R平方值。您可以自己可能實現它...

作爲一種變通方法,您還可以使用的東西,如:

  1. 獲得C輪廓
  2. 適合橢圓E裝到C
  3. 比較è至C.

要比較它們,您可以使用矩陣(參見cv::moments()cv::matchShapes())。 雖然我不認爲你需要不變的時刻。

或者,您可以繪製C和E找到表面重疊的比例。

祝你好運,

0

@Ahsan - 你必須通過所有輪廓,迭代和嘗試,以適應橢圓。如果您發現該曲線擬合數學困難短路線將是

像 - 通過每個輪廓 迭代 - 放棄非凸輪廓 - 現在使當前輪廓的口罩,使用CV :: matchShapes功能做shapeMatching 。

0

fitEllipse給我們RotatedRect。

而且我們可以使用橢圓特定的屬性,可以將其轉換爲圓。

double is_ellipse(std::vector<cv::Point> const& cloud, RotatedRect const& rr) 
{ 
    double distance =0; 

    for(auto const& point: cloud) 
    { 
     Point2f unit; 
     unit.x = ((rr.center.x - point.x ) * cos(- rr.angle*(3.1415926/180)) - (rr.center.y - point.y ) * sin(- rr.angle*(3.1415926/180))) * 2/rr.size.width ; 
     unit.y = ((rr.center.x - point.x ) * sin(- rr.angle*(3.1415926/180)) + (rr.center.y - point.y ) * cos(- rr.angle*(3.1415926/180))) * 2/rr.size.height; 

     double len = sqrt(unit.x* unit.x + unit.y * unit.y); 
     distance += fabs(1- len); 
    } 
    return distance/cloud.size(); 
} 

這裏是用來計算圓的邊界的平均距離。 很容易修改其他一些統計功能,如:最大偏差。