2016-09-27 291 views
0

我需要從這個圖像(左上角,右上角,左下角和最後右下角)查找圓的半徑和極座標點(Hough Circle Transform)

圖像在疊加回原始圖像之前先通過閾值然後進行Canny邊緣檢測。

enter image description here 例如

enter image description here

(通過油漆畫),並將它們連接在一起(通過油漆畫)

enter image description here

enter image description here

,但我怎麼想得到半徑和x y從中心開始座標,然後畫線?

for (int i = 0; i < circles.size(); i++) 
{ 
    //icout << i<<"\n"<<endl; 
    Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1])); 
    stringstream ss; 
    ss << i + 1; 
    putText(dst, ss.str(), center, 1, 1, Scalar(255, 0, 225), 2, 0); 
    int radius = cvRound(circles[i][2]); 
    // circle center 
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0); 
    // circle outline 
    circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0); 
    //for original image overlap 
    circle(dst, center, 3, Scalar(0, 255, 0), -1, 8, 0); 
    // circle outline 
    circle(dst, center, radius, Scalar(0, 255, 255), 3, 8, 0); 


} 

這是演示代碼,但我 從

for (int i = 0; i < circles.size(); i++) 

努力理解有關 circles.size()
Point center(cvRound(circles[i][ 0]), cvRound(circles[i][1])); 

我會,如果感激你可以用更簡單的方式向我解釋這一點,因爲我仍然在學習過程中,只是我開始的一個起點而已。 謝謝!

+0

不完全是對您問題的回答,但可能是所有圈子的凸包是您最初想要的解決方案嗎? http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html – Micka

+0

@Micka是的!這正是我所需要的,除非我只需要大綱。我是否能夠改變它的顏色,以便我能夠將它設爲閾值而僅獲得沒有內部輪廓的輪廓?我不太確定rng.uniform(0,255)是怎麼做的,爲什麼它需要3個:l – Lyber

+0

嘗試'for(int i = 0; i (),0,Point()); } '只能以全紅色繪製船體。 rng代碼是一個隨機數生成器,所以教程代碼將以隨機顏色繪製! – Micka

回答

0

我認爲你需要顯示圓的定義,即是什麼類型的圈子

看起來它可能是一個vector<vector<int>>(或某種形式的tuple<int>

除非我誤解你的問題circles.size()是圓的是一個數量,而不是圓(size())的半徑函數返回在載體

vector<int>似乎存儲[0]的x位置和在[1]

y位置和r個元素的數量在圓的adius [2]

+0

謝謝!管理了解更好一點:) – Lyber

0

如果看一下上圈霍夫OpenCV的文檔變換http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghcircles#houghcircles

可變圓圈下你可以看到,它是爲每個圓圈的向量是一個3元組值(X,Y,半徑)

所以你的情況以獲得圓的數據I:

x座標=圓圈[I] [0]

y座標=圓圈[I] [1]

半徑=圓圈[I] [2]

circles.size():是被發現圓圈的數量。

之後,爲了找到左下角點,例如只需查找y座標最低的6個點,並從該組中找出x座標最小的點。

+0

謝謝!我設法得到了x和y座標,但是您說「y座標最低的6個點」是什麼意思? – Lyber

+0

爲圓圈的所有y座標創建一個向量。比對它進行排序(並獲取索引)並採用y座標最低的6個圓圈的值。對於那些圓圈找到具有最低x座標的圓圈。 –

+0

對不起,我真的是一個緩慢的學習者,但現在我第一次創建一個向量,然後將x和y座標添加到圓圈內的列表中.size for loop vector data; data.push_back(Point(circles [i] [0],circles [i] [1])); – Lyber

相關問題