2011-12-11 36 views
29

輪郭を見つけるときにCV_RETR_CCOMP引数を使用しました。これは、2つのレベルの階層を作成することになっています。最初のレベルは外側の輪郭、2番目のレベルは穴の境界です。しかし、私は以前に階層を使ったことがないので、これに慣れていません。OpenCVのfindContours()で階層を使用していますか?

誰かが穴の境界にアクセスする方法について私に教えてもらえますか?私は外側の輪郭を無視し、穴の境界線のみを描きたい。コード例を理解できます。私はC言語ではなくC言語のインターフェイスを使用していますので、C関数を提案しないでください(例:cvFindContours()の代わりにfindContours()を使用してください)。

+0

C++バージョンとCバージョンの間の移行は簡単です。 FYI。 –

答えて

36

findContoursによって返される階層は、次の形式を有する。 hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}

CV_RETR_CCOMP、外側輪郭と正孔の階層を返します。 これは、hierarchy[idx]の要素2と要素3が-1以下でない、つまり各要素が親または子を持たないか、または親であるが子はないか、または子であるが親はないことを意味します。

親を持つが子供を持たない要素は、穴の境界になります。

つまり、基本的にhierarchy[idx]を通過し、hierarchy[idx][3]>-1で何かを描画します。以下のような

何か(。Pythonで動作しますが、C++をテストしていないアイデアはいえ結構です。):CV_RETR_CCOMPを使用した場合

findContours(image, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); 

if (!contours.empty() && !hierarchy.empty()) { 

    // loop through the contours/hierarchy 
    for (int i=0; i<contours.size(); i++) { 

     // look for hierarchy[i][3]!=-1, ie hole boundaries 
     if (hierarchy[i][3] != -1) { 
      // random colour 
      Scalar colour((rand()&255), (rand()&255), (rand()&255)); 
      drawContours(outImage, contours, i, colour); 
     } 
    } 
} 
+1

@Farhadはあなたが何らかのテストをしていることを確認します。階層は、あなたが期待するものではないかもしれません。私はあなたの画像でhttp://stackoverflow.com/questions/8449378/finding-contours-in-opencvからこの画像を試してみました。画像フレームは親で、外側の輪郭は子供で、内側の輪郭もどちらもありませんでした。 – SSteve

+0

@Farhad申し訳ありませんが、私はイメージフレームが子供であり、サークルの外側輪郭が親であることを意味しました。 – SSteve

+0

ありがとう、私はそれを回避する方法を見つける必要がありますね。 – fdh

3

は私の知る限り、すべての穴は同じレベルにあります。

int firstHoleIndex = hierarchy[0][2]; 
for (int i = firstHoleIndex; i >= 0 ; i = hierarchy[i][0]) 
// contours.at(i) is a hole. Do something with it. 
関連する問題