2013-04-14 37 views
6

私はcvCannyとcvFindContoursを適用したので、均一な領域を見つけるために画像の輪郭を分離しようとしています。次に、キーを押すたびに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(); 
    } 

最初の繰り返しではすべての輪郭が描画され、2番目の描画ではALLを描画し、3番目の描画では2つ以外の描画を行います。

そして、私は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の場合は、等高線の次のすべての等高線と等高線より下のすべての等高線が描画されます。 数値が 負の場合、関数は 輪郭の後に続く輪郭を描画しませんが、輪郭の子輪郭を $ | \ texttt {max_ level} | -1 $レベルまで描画します。

編集:

厚さ - 輪郭を用いて描かれる線の太さ:

thicknessパラメータの負の値を使用して、輪郭を充填します。 が負の場合(たとえば、= CV_FILLED)、輪郭の内部が描画されます。

+0

ありがとう、それは、私はそのパラメータに気づいていなかった。今私はそれらを埋める必要がある、それのための任意の機能はありますか?そうでない場合、どうすればそれについて行くことができますか?多分流域は閉鎖されたもののために働くであろうが、時には開かれた等高線もある。 –

+1

thicknessパラメータに負の値を使用します。それがうまくいかない場合は、これらのいずれかが役に立ちます:http://stackoverflow.com/questions/12929197/opencv-closing-a-shape-and-filling-it、http://stackoverflow.com/質問/ 1716274/fill-the-holes-in-opencv – maditya

+0

もう一度おねがいします。 –

関連する問題