28

OpenCV のフラッディング機能のドキュメントには、次のように記載されています。

関数はマスクを使用および更新するため、マスクの内容を初期化する責任はユーザーにあります。塗りつぶしは、マスク内のゼロ以外のピクセルを横切ることはできません。たとえば、エッジ検出器の出力をマスクとして使用して、エッジでの塗りつぶしを停止できます。関数の複数の呼び出しで同じマスクを使用して、塗りつぶされた領域が重ならないようにすることができます。

関数はマスクをどのように更新しますか? 塗りつぶし内のすべてのピクセルをゼロ以外の値に設定しますか?

4

3 に答える 3

31

マスクのシード ポイントと同じ連結要素内のゼロ値のピクセルはすべて、指定した値に置き換えられます。この値をパラメータに追加し、flags8 ビット左シフトする必要があります。

uchar fillValue = 128;
cv::floodFill(img, mask, seed, cv::Scalar(255) ,0, cv::Scalar(), cv::Scalar(), 4 | cv::FLOODFILL_MASK_ONLY | (fillValue << 8));

簡単ですが、おそらくわかりやすい例を次に示します。次のようなイメージを作成します。

//Create simple input image
cv::Point seed(4,4);
cv::Mat img = cv::Mat::zeros(100,100,CV_8UC1);
cv::circle(img, seed, 20, cv::Scalar(128),3);

この画像の結果:

元の画像

次に、マスクを作成して塗りつぶします。

//Create a mask from edges in the original image
cv::Mat mask;
cv::Canny(img, mask, 100, 200);
cv::copyMakeBorder(mask, mask, 1, 1, 1, 1, cv::BORDER_REPLICATE);

//Fill mask with value 128
uchar fillValue = 128;
cv::floodFill(img, mask, seed, cv::Scalar(255) ,0, cv::Scalar(), cv::Scalar(), 4 | cv::FLOODFILL_MASK_ONLY | (fillValue << 8));

次の結果が得られます。

洪水で満たされたマスク

マスク内の白いピクセルはエッジ検出の結果であり、灰色のピクセルは塗りつぶしの結果です。

更新: コメントに応じて、フラグ値4は、色値の差を比較するピクセル近傍を指定します。ドキュメントから:

下位ビットには、関数内で使用される接続値 4 (デフォルト) または 8 が含まれます。接続性は、ピクセルのどの近傍が考慮されるかを決定します。

cv::FLOODFILL_MASK_ONLYフラグが渡されない場合、イメージとマスクの両方が更新されますが、塗りつぶしはゼロ以外のマスク値で停止します。

于 2013-05-23T16:28:00.237 に答える