2012-07-02 91 views
5

我想在下面的圖片中使用OpenCV中的findcontours()函數。OpenCV findcontours爲每個圓圈返回2個輪廓

findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

當我做這個查詢:contours.size()它返回18,所以,似乎2輪廓每個圓圈。這個圓圈就像你可以看到的1個像素的厚度,2個輪廓如何?如果是這樣,它是一個用於外部,一個用於內部,如何強制該功能爲每個圓圈檢測一個輪廓?我認爲輪廓被定義爲像素的連續序列,1像素厚。

Says there are 18 contours!!

回答

4

我無法證實這一點,但我認爲這個功能使用的算法做了等同於計算每個功能的梯度。這意味着在外邊緣和內邊緣上會出現輪廓,就像您所說的那樣。 爲了證實這一點,你可以嘗試使用在圈中充滿了白色輸入圖像(elimininating內輪廓)

你也可以在findContours功能

例如不同的參數測試,嘗試使用CV_RETR_EXTERNAL,而不是CV_RETR_TREE我認爲內圓嵌套在一個外層內,所以這應該迫使它返回只有外部的

+0

但是,當我看這個例子[這裏](http://jmpelletier.com/a-simple-opencv-tutorial/)它似乎不是分別計算內部和外部。但是這個例子有findcontours的C版本。舊的和新的實現有區別嗎? –

+0

不,在C和C++版本之間不應有任何影響最終結果的差異。事實上,從我記憶中,其中一個只是另一個的包裝。 但是,從這個鏈接看圖片,我看到了與你所說的完全相反的東西。它似乎是檢測每個圓的內外輪廓,這使得在那裏顯示的圖像更有意義 – Naps62

+1

的確,使用CV_RETR_EXTERNAL標誌應該爲您修復它。這裏有一個完整的標誌列表: http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#void findContours(InputOutputArray image,OutputArrayOfArrays輪廓,OutputArray層次結構,int模式,int方法,Point偏移量) –

0

你可能已經想通了這一點,但...

findContours僅關注白色物體,因此將每個挖空的圓識別爲一個帶,從而生成兩個輪廓。

最好的方法是用實心圓圈創建另一個圖像,併爲該圖像應用findContoours。它會給你你想要的。