2013-04-14 82 views
6

我想要分離的圖像的輪廓(以找到均勻區域),所以我施加cvCanny然後cvFindContours,然後我使用下面的代碼到每個I按下一個鍵時繪製1個輪廓:如何在OpenCV中獲得單獨的輪廓(並填充它們)?

for(; contours2 != 0; contours2 = contours2->h_next){ 
     cvSet(img6, cvScalar(0,0,0)); 
     CvScalar color = CV_RGB(rand()&255, rand()&255, rand()&255); 
     cvDrawContours(img6, contours2, color, cvScalarAll(255), 100); 
     //cvFillConvexPoly(img6,(CvPoint *)contours2,sizeof (contours2),color); 
     area=cvContourArea(contours2); 
     cvShowImage("3",img6); 
     printf(" %d", area); 
     cvWaitKey(); 
    } 

但是在第一次迭代中它繪製了所有輪廓,第二次繪製了除一個之外的所有輪廓,第三次繪製了除兩個之外的所有輪廓,依此類推。

如果我用它填充大部分屏幕cvFillConvexPoly功能(儘管我寫這個,我意識到一個凸多邊形不會爲我工作,我需要填寫剛剛insideof輪廓)

所以,我如何才能在for的每次迭代中取得1個輪廓,而不是所有剩餘的輪廓?

謝謝。

回答

12

您需要將傳遞給函數的最後一個參數(當前爲100)更改爲0或負值,具體取決於您是否要繪製子項。

根據文檔(http://opencv.willowgarage.com/documentation/drawing_functions.html#drawcontours), 功能具有以下特徵:

void cvDrawContours(CvArr *img, CvSeq* contour, CvScalar external_color, 
CvScalar hole_color, int max_level, int thickness=1, int lineType=8) 

從同一個文檔,max_level有以下目的(最適用的部分是黑體):

max_level - 繪製輪廓的最大級別。 如果爲0,則只繪製輪廓 。如果爲1,則繪製相同的 級別後面的輪廓和所有輪廓。如果2,繪製等高線下面的所有等高線以及所有等高線1,等等。 如果值爲 爲負數,則該函數不會繪製輪廓後面的輪廓,而是繪製輪廓的子輪廓直至達到 $ -1。

編輯:

爲了填充輪廓,使用負的值的參數thickness

厚度 - 輪廓繪製用線條的粗細。如果是否爲 否定(例如,= CV_FILLED),則繪製輪廓內部。

+0

非常感謝,就是這樣,我沒有注意到這個參數。現在我只需要填充它們,是否有任何功能?如果不是,我怎麼去解決它?也許分水嶺可以用於封閉的邊界,但有時候也有開放的輪廓。 –

+1

對厚度參數使用負值。如果這不適合你,也許這些將有助於:http://stackoverflow.com/questions/12929197/opencv-closing-a-shape-and-filling-it,http://stackoverflow.com/問題/ 1716274/fill-the-holes-in-opencv – maditya

+0

再次感謝,使用負厚度完美地實現了這個技巧。 –