マスクのシード ポイントと同じ連結要素内のゼロ値のピクセルはすべて、指定した値に置き換えられます。この値をパラメータに追加し、flags
8 ビット左シフトする必要があります。
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
フラグが渡されない場合、イメージとマスクの両方が更新されますが、塗りつぶしはゼロ以外のマスク値で停止します。