2011-12-17 69 views
0

輪郭が与えられると、輪郭内に属するピクセルを効率的にカウントする方法は何ですか?輪郭内のピクセルを効率的にカウントする方法

私はOpenCVの機能
CV :: pointPolygonTest()に

を使用してみましたが、機能は非常に非効率的であると大きな輪郭のために多くの時間を要します。
助けてください

答えて

1

findContours()関数で輪郭を抽出したとします。

次に、contourArea()を直接使用することができます。

+0

私は 'cv :: findcontours()'を使って輪郭を抽出しています。しかし、輪郭の内側にあるすべてのピクセルの 'xy座標 'も必要であり、後で使用する' std :: vector'として保存します。それは私が 'cv :: pointPolygonTest()'を使う理由です。より良い方法を提案できますか? – user1036908

+0

hmm、空白の画像に輪郭(fillPoly()のようなもの)からマスクを作成しようとすることができます。したがって、ピクセルが輪郭の内側にあり、ゼロがアウトサイズのイメージを持つことになります。 – Sam

+1

OpenCVのcontourAreaのドキュメントから、 "関数は、モーメント()と同様に、グリーン式を使用して計算されます。したがって、輪郭を描くと、返される領域と非ゼロピクセルの数drawContours()またはfillPoly()を使用した場合は異なる場合があります。また、関数は自己交差を含む輪郭に対して誤った結果を最も確実に与えます。 –

0

単一の輪郭点から始まる領域を塗りつぶす単純な再帰的なトラバーサルがあると思います。それが最初に行かれると効率的になりますので、私はあなたが行イテレータを使うことができると思います。

効率を最も重視する場合は、おそらく再帰をループに展開してfor-unloopingを実行できます。

0

contourAreaはあなたが結果を期待得られない場合は、このアプローチに従うことができます。新しい空のマットで

  1. コピー輪郭
  2. は新しい部分行列にcountNonZeroを適用すると、あなたは番号を取得します非黒画素の

    //1. Copy the contour in a new empty Mat 
        Rect cRect = boundingRect(*it); //it is an iterator for your contours vector 
        Mat subImg = dilatedImg(cRect); 
        double cArea = countNonZero(subImg); 
    

注:バイナリイメージを持っていない場合、あなたは旧姓も右のピクセルだけをカウントする前に、それを閾値にする。

関連する問題