1

に輪郭内部子輪郭線の数をカウント私はこのソース画像OpenCVの

enter image description here

があると私は私が輪郭を使用するこの

enter image description here

を取得するバイナリ閾値を適用しています子供の輪郭を持つものとそうでないものとを区別する。結果の画像は

enter image description here

しかし、緑の各輪郭に含まれる子供の輪郭の数をどのように数えますか?これは、私が使用しているコードです: - :

std::vector<int> number_of_inner_contours(contours.size(), -1); 
int number_of_childs = 0; 
for (size_t i = 0; i < contours.size(); i++) 
{ 

    int first_child_index = hierarchy[i][2]; 
    if (first_child_index >= 0) 
    { 
     int next_child_index = hierarchy[first_child_index][0]; 
     if (number_of_inner_contours[next_child_index]<0) 
     { 
      number_of_childs = number_of_inner_contours[next_child_index]; 
     } 
     else 
     { 
      while (next_child_index >= 0) 
      { 
       next_child_index = hierarchy[next_child_index][0]; 
       ++number_of_childs; 
      } 
      number_of_inner_contours[i] = number_of_childs; 
     } 
    } 
    else 
    { 
     number_of_inner_contours[i] = 0; 
    } 
    cout << "\nThe contour[" << i << "] has " << number_of_inner_contours[i] << "child contours"; 
} 

しかし、私が得た出力はのようだった:私はそれをチェックアウトするために最後にHumamからのコードを追加し

Mat binMask = lung;// the thresholded image 
Mat lung_src = imread("source.tiff");// the source image 
//imshow("bin mask", binMask); 
vector<std::vector<cv::Point>> contours; 
vector<cv::Vec4i> hierarchy; 
int count = 0, j; 

double largest_area = 0; 
int largest_contour_index = 0; 

findContours(binMask, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0)); 

for (int i = 0; i < contours.size(); i++) 
{ 
    double a = contourArea(contours[i], false); // Find the area of contour 
    if (a>largest_area) 
    { 
     largest_area = a; 
     largest_contour_index = i; 
    } 
    for (j = 0; j <= i; j++) 
    { 
     if (hierarchy[j][2] != -1) // means it has child contour 
     { 

       drawContours(lung_src, contours, j, Scalar(0, 255, 0), 1, 8, hierarchy, 0, Point()); 

     }   
     else // means it doesn't have any child contour 
     { 
      drawContours(lung_src, contours, j, Scalar(0, 0, 255), 1, 8, hierarchy, 0, Point()); 
     } 
    } 
} 
drawContours(lung_src, contours, largest_contour_index, Scalar(255, 0, 0), 1, 8, hierarchy, 0, Point()); 
imshow("lung-mapped", lung_src); 

EDIT-1-

OpenCV documentationから
 The contour[456 ] has 0 child contours 
     The contour[457 ] has 0 child contours 
     The contour[458 ] has 0 child contours 
     The contour[459 ] has -1 child contours 

答えて

0

階層 - オプションの出力ベクトル。 イメージトポロジに関する情報が含まれています。輪郭の数と同数の要素があります。 の各i番目の輪郭輪郭[i]に対して、要素階層[i] [0]、 ハイサイi、hiearchy [i] [2]、およびhiearchy [i] [3]は0ベースのインデックス の同じ階層レベル、最初の子輪郭および親 等高線の次の輪郭および前の輪郭の輪郭にそれぞれ表示される。輪郭iに次のものがない場合は、 前、親、または入れ子になった輪郭の場合、 階層[i]の対応する要素は負になります。

これは仕事をしているため未テストコードです:

std::vector<size_t> number_of_inner_contours; 
number_of_inner_contours.reserve(contours.size()); 
for (size_t i = 0; i < contours.size(); i++){ 
    size_t number_of_childs = 0; 
    auto first_child_index=hierarchy[i][2]; 
    if(first_child_index>=0){ 
     auto next_child_index=hierarchy[first_child_index][0]; 
     while (next_child_index>=0){ 
      next_child_index=hierarchy[next_child_index][0]; 
      ++number_of_childs; 
     } 
     number_of_inner_contours.emplace_back(number_of_childs); 
    } 
    else{ 
     number_of_inner_contours.emplace_back(0); 
    } 
} 

このコードは、動的プログラミングの概念を使用することによって、より良い方法で行うことができます。これは最初の試行でもあります。

std::vector<int> number_of_inner_contours(contours.size(),-1); 
for (size_t i = 0; i < contours.size(); i++){ 
    auto number_of_childs = 0; 
    auto first_child_index=hierarchy[i][2]; 
    if(first_child_index>=0){ 
     auto next_child_index=hierarchy[first_child_index][0]; 
     if(number_of_inner_contours[next_child_index]<0){ 
      number_of_childs=number_of_inner_contours[next_child_index]; 
     } 
     else{ 
      while (next_child_index>=0){ 
       next_child_index=hierarchy[next_child_index][0]; 
       ++number_of_childs; 
      } 
      number_of_inner_contours[i]=number_of_childs; 
     } 
    } 
    else{ 
     number_of_inner_contours[i]=0; 
    } 
} 
+0

申し訳ありませんが、コードでは希望の結果が得られません。 –

+0

「希望の結果が得られません」という内容を明確にしてください。コード内にあるエラーを編集しました。もう一度試してみてください –

+0

@ Humam - これをチェックできますか? –