2012-03-29 84 views
3

我一直在嘗試使用,以找到一個單一的形狀在很簡單的背景輪廓的OpenCV的findContour(我想用C++句法)。但是,它不斷將輪廓設置爲輪廓,而不是形狀本身。我想這是因爲Canny造成的白色邊緣,它不會使形狀閉合。OpenCV的 - 找到或訪問形狀輪廓不是由BG包圍,只有一個輪廓分離

例A:形狀是由圖像的邊緣 (這不是實際的輸入圖像,但更簡單的輸入圖像來說明這個問題。)

情形B :背景圍繞形狀

有我使用的主要功能:

findContours(grayImage, contours, hierarchy, RETR_LIST,CHAIN_APPROX_SIMPLE); 
approxPolyDP(Mat(contours.at(largestContourIndex)),poly,3,true); 
drawContours(output, contours, largestContourIndex, RGB(250,0,100), -1, 8, hierarchy, 0, Point()); 

編輯:跳繩邊緣檢測提供了我需要的輪廓,但我需要有最好的輪廓接近,我可以得到。

在此先感謝。

+0

我看到你在我的回答後編輯了你的帖子。如果您對我的答案留下評論並解釋天氣是否有幫助,那將會很好,如果不是,那麼爲什麼這種方法不起作用(即您嘗試時發生了什麼) – penelope 2012-03-30 09:41:38

+0

我實際上已經嘗試過您的方法以及其他幾種方法。我只是猶豫是否讓這個問題變得複雜而令人沮喪地回答。很快會做出回覆和編輯。謝謝您的幫助。 – leya 2012-04-01 06:49:40

回答

0

我還沒有找到爲什麼我不能得到形狀輪廓的原因,但我找到了解決方法。做腐蝕和膨脹之後,我基本上已經繪製邊境或爲背景的輸入圖像的像素最外層的矩形包圍的形狀,...

rectangle(input,Point(0,0),Point(input.cols-1,input.rows-1),Scalar(0,0,0),1,8,0); 

...因此,讓坎尼平局一個封閉的形狀輪廓,並給我我想要的形狀輪廓。我仍然試圖成功地顛倒Canny的輸出,就像@dvhamme建議的一樣,但它仍然給我錯誤。如果有人指出如何正確地獲取或訪問形狀輪廓,但是感謝大家的幫助,會更好。

+1

我轉載了你的問題,反轉canny圖像並沒有幫助。但是,工作是使用'threshold()'分割對象,然後運行'findContours()'。輪廓檢測器顯然並不意味着在線檢測後使用,但對於二值分割圖像,無論物體是否觸及邊緣,它都可以很好地工作。 – dvhamme 2012-04-01 20:17:41

+0

感謝您的時間!一旦我回到這個項目,我會記住嘗試'threshold()'。我一直在做'inRange(src_Mat,min,max,dst_Mat)'這樣的事情,並且自那以後就沒有觸及過。 – leya 2012-04-02 03:47:54

1

你有沒有試玩過形態操作

如果你的基本問題是你得到的輪廓是在物體的外部而不是內部,尤其是如果你的物體是由如此明確的和大多數規則的形狀構成的, 。

我知道OpenCV的擴張侵蝕,以及開放關閉操作的實現。一個非常簡單的方法可能適用於您的情況,只是稍微削弱一下形狀(可能是1-2-3次迭代),然後按照您現在正在做的事情做。那麼希望你能得到被腐蝕形狀的外部輪廓,實際上它應該是原始形狀的內部輪廓。

我覺得OpenCV的真正實現,甚至一些更復雜的形態,但一如既往,先嚐試簡單的東西:d

+0

我實際上是在輸入圖像上進行侵蝕然後膨脹,並使用軌跡條來控制它們中的每一個的內核。我明白你的方法可以消除邊緣附近形狀的部分。但是在找到輪廓以改善近似輪廓之前,我必須先使用邊緣檢測。做一個邊緣檢測仍然會給我一個帶有輪廓的黑色圖像。基本上會有3組像素 - (1)背景,(2)白色輪廓和(3)形狀,這引起我的主要問題 - 爲什麼組3沒有被OpenCV包圍在輪廓中? TIA – leya 2012-04-01 07:05:03

1

在我看來,你正在尋找的輪廓可能檢測到,但沒有使用它。相反,您正在使用最大的輪廓。嘗試逐個繪製所有找到的輪廓,看看它是否在那裏。

如果不是,嘗試反轉canny圖像並重復該過程。

+0

這就是我所期望的,但我嘗試着逐個繪製輪廓,並改變OpenCV的findContour作爲參數的輪廓模式和輪廓方法。我對最初的閾值進行了嘗試,但形成的輪廓總是圍繞輪廓。我會嘗試你的建議。謝謝。 – leya 2012-04-01 08:00:47