1

私はこのソース画像を持っています

ここに画像の説明を入力

これを取得するためにバイナリしきい値を適用しました

ここに画像の説明を入力

輪郭を使用して、子輪郭を持つものとそうでないものを区別しました。結果の写真は

ここに画像の説明を入力

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

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- 最後に Humam のコードを追加してチェックアウトしました。

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";
}

しかし、私が得た出力は次のようなものでした:

      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
4

1 に答える 1

1

OpenCVのドキュメントから:

hierarchy – イメージ トポロジに関する情報を含むオプションの出力ベクトル。等高線の数と同じ数の要素があります。i 番目の輪郭のそれぞれについて、要素 hierarchy[i][0] 、 hiarchy i、 hiearchy[i][2] 、および hiearchy[i][3] は、次の輪郭の 0 ベースのインデックスに設定されます。同じ階層レベルの次の輪郭と前の輪郭、それぞれ最初の子輪郭と親輪郭。輪郭 i に次、前、親、またはネストされた輪郭がない場合、hierarchy[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;
    }
}
于 2016-05-31T07:01:55.630 に答える