2013-05-23 13 views
16

documentation za flood fill stanów czynnościowych w OpenCV:OpenCV flood fill z maską

Funkcja wykorzystuje i uaktualnia maskę, więc wziąć odpowiedzialność inicjowanie zawartości maski. Wypełnienie powodziowe nie może przekroczyć niezerowych pikseli w masce. Na przykład wyjście detektora krawędzi może być używane jako maska ​​do zatrzymywania napełniania na krawędziach. Możliwe jest użycie tej samej maski w wielu wywołaniach funkcji, aby upewnić się, że wypełniony obszar nie zachodzi na siebie.

W jaki sposób funkcja aktualizuje maskę? Czy ustawia wszystkie piksele w obrębie wypełnienia na pewną niezerową wartość?

Odpowiedz

23

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:

Original image

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:

Flood-filled mask

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.

+0

Czy ktoś przepisać ten spokój kodu w odpowiedzi na Java, proszę? –

+0

@Aurelius Dzięki za wskazanie, że piksele maski muszą być zerowe, aby się wypełnić.Ta wskazówka uratowała mi dzień ... – tisch

Powiązane problemy