2013-04-14 17 views
6

I (üniforma bölgeleri bulmak için) bir resmin hatlarını ayırmak için çalışıyorum bu yüzden o, cvCanny ve ardından cvFindContours uygulanan ben 1 kontur ben anahtar bir basın her zaman çizmek için şu kodu kullanın:OpenCV'de nasıl konturlar (ve bunları doldurulur) alınır?

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(); 
    } 

Ancak, ilk yinelemede TÜM konturları çizer, ikincisinde TÜMÜ çeker, bir tanesini çizer, üçüncüsü iki çeker, vs. Ben ekranın en doldurur cvFillConvexPoly işlevini kullanırsanız

Ve Yani

(Bu yazdığım gibi ben bir dışbükey çokgen benim için işe yaramaz fark rağmen, ben kontur insideof sadece doldurmak gerekir) , kalan tüm konturlar yerine, her iterasyonda sadece 1 kontur nasıl alabilirim?

Teşekkürler.

cevap

12

Çocuğunuzu çizmek isteyip istemediğinize bağlı olarak, 100 numaralı, 0 numaralı ya da negatif değeri olan işleve ilettiğiniz son parametreyi değiştirmeniz gerekir.

belgelerinde (http://opencv.willowgarage.com/documentation/drawing_functions.html#drawcontours) 'a göre işlev aşağıdaki imzası vardır: Aynı Dokümanlar

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

, max_level aşağıdaki amacı vardır (en uygun kısmı kalın olan):

max_level - Çizilmiş konturlar için maksimum düzey. 0 ise, yalnızca çevre çizgisi çizilmiş'dir. 1 ise, aynı seviyesinde takip eden kontur ve tüm konturlar çizilir. 2 ise, tüm konturları takip eden ve tüm konturları bir konturların altına çizin, vb. Değer, negatifse, işlev konturundan sonra aşağıdaki çizgileri çizmez ancak konturlarının alt çizgisini $ | \ texttt {max_ level} | -1 $ düzeyine kadar çeker.

Düzenleme:

thickness parametre için negatif bir değer kullanın konturu doldurmak için:

kalınlık - kontür ile çizilir çizgilerin kalınlığı. negatifse (Örneğin, = CV_FILLED), kontur iç kısımları çizilir.

+0

Çok teşekkürler, öyleydi, bu parametreyi fark etmemiştim. Şimdi sadece onları doldurmam gerekiyor, bunun için herhangi bir işlev var mı? Eğer değilse, nasıl gidebilirim? Belki de havza kapalı olanlar için çalışabilir, ancak bazen açık hatlar da vardır. –

+1

Kalınlık parametresi için negatif bir değer kullanın. Bu sizin için işe yaramıyorsa, belki bunlardan biri yardımcı olacaktır: http://stackoverflow.com/questions/12929197/opencv-closing-a-shape-and-filling-it, http://stackoverflow.com/ question/1716274/fill-the-holes-in-opencv – maditya

+0

Tekrar teşekkürler, Negatif bir kalınlık kullanmak hileyi mükemmel yapar. –

İlgili konular