1

私はopencv 2.4.13を使用しています

ConnectedComponentWithStatsを使おうと思ったのですが、周囲が返ってこず、面積や幅などしか返ってこない... 等高線で面積を求める方法はありますが、反対ではありません(画像全体ではなく、1つのコンポーネントを意味します)。

メソッドarcLengthは、輪郭だけでなくコンポーネントのすべてのポイントを持っているため、うまく機能しません。

コンポーネントの各ピクセルを反復処理して、同じコンポーネントにない隣人がいるかどうかを確認することで、それを見つけるBFの方法があることを私は知っています。しかし、私はより安価な機能が欲しい. それ以外の場合は、メソッド findContours によって検出された輪郭にコンポーネントをリンクする方法を知っていれば、それは私にも適しています。

ありがとう

4

2 に答える 2

2

最も簡単なのは、おそらく を使用することfindContoursです。

によって計算された i 番目のコンポーネントの等高線を計算できるため、connectedComponents(WithStats)それらはラベルに揃えられます。を使用CHAIN_APPROX_NONEすると、輪郭内のすべてのポイントが取得されるためsize()、ベクトルの はすでに周囲の測定値です。最終的arcLength(...)には、より正確な結果を得るために使用できます。

Mat1i labels;
int n_labels = connectedComponents(img, labels);

for (int i = 1; i < n_labels; ++i)
{
    // Get the mask for the i-th contour
    Mat1b mask_i = labels == i;

    // Compute the contour
    vector<vector<Point>> contours;     
    findContours(mask_i.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);

    if (!contours.empty())
    {
        // The first contour (and probably the only one)
        // is the one you're looking for

        // Compute the perimeter
        double perimeter_i = contours[0].size();
    }
}
于 2016-06-10T10:49:34.723 に答える