Wszystkie piksele o wartości zero w tym samym podłączonym komponencie, co punkt początkowy maski, są zastępowane określoną wartością. Wartość ta może być dodana do parametru flags
, przesuwany w lewo o 8 bitów:
uchar fillValue = 128;
cv::floodFill(img, mask, seed, cv::Scalar(255) ,0, cv::Scalar(), cv::Scalar(), 4 | cv::FLOODFILL_MASK_ONLY | (fillValue << 8));
prosta, ale może pouczające przykład w następujący sposób. Tworzenie obrazu tak:
//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);
wyniki w tym obrazie:
Następnie, tworząc maskę i powódź napełniania go:
//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));
Daje to wynik:
Białe piksele w masce są wynikiem wykrywania krawędzi, a szare piksele są wynikiem wypełnienia powodziowego.
UPDATE: W odpowiedzi na komentarz, wartość flagi 4
określa sąsiedztwa piksela z którego można porównać różnicę wartości koloru. Z dokumentacji:
Dolne bity zawierają wartość połączenia, 4 (domyślnie) lub 8, używane w funkcji. Łączność określa, które sąsiednie piksele są uwzględniane.
Gdy flaga cv::FLOODFILL_MASK_ONLY
nie jest przekazywana, zarówno obraz i maska są aktualizowane, ale nadzienie powódź zatrzyma się przy wszelkich wartościach niezerowych maski.
Czy ktoś przepisać ten spokój kodu w odpowiedzi na Java, proszę? –
@Aurelius Dzięki za wskazanie, że piksele maski muszą być zerowe, aby się wypełnić.Ta wskazówka uratowała mi dzień ... – tisch