2013-03-05 16 views
11

Jak znaleźć położenie wszystkich niezerowych pikseli w obrazie binarnym (cv :: Mat)? Czy muszę skanować każdy piksel na obrazie lub czy istnieje funkcja wysokiego poziomu OpenCV, którą można wykorzystać? Wyjście powinno być wektorem punktów (lokalizacje pikseli).OpenCV - lokalizacje wszystkich niezerowych pikseli w obrazie binarnym

Na przykład, można to zrobić w Matlab po prostu jako:

imstats = regionprops(binary_image, 'PixelList'); 
locations = imstats.PixelList; 

lub, jeszcze prostszy

[x, y] = find(binary_image); 
locations = [x, y]; 

Edit: Innymi słowy, jak znaleźć współrzędne wszystkich nie- zero elementów w cv :: Mat?

+1

której wersji opencv używasz? W wersji 2.4.4 Pythona mogłem znaleźć podobną funkcję "cv2.findNonzero", co oznacza, że ​​powinno być tam również w C++. Ale nie jest to w dokumentach. Więc zainstaluj 2.4.4 i sprawdź tę funkcję. –

+0

Thx, nie ma cv :: findNonzero w wersji OpenCV 2.4.2 (C++), którą posiadam. – Alexey

+0

Myślę, że przychodzi w 2.4.4. Mam go od wersji 2.4.4 Pythona. Więc jeśli chcesz go użyć, możesz zaktualizować do 2.4.4 –

Odpowiedz

10

Zgodnie z sugestią @AbidRahmanK, w wersji OpenCV 2.4.4 dostępna jest funkcja cv::findNonZero. Użycie:

cv::Mat binaryImage; // input, binary image 
cv::Mat locations; // output, locations of non-zero pixels 
cv::findNonZero(binaryImage, locations); 

Wykonuje zadanie. Ta funkcja została wprowadzona w wersji OpenCV 2.4.4 (na przykład nie jest dostępna w wersji 2.4.2). Ponadto, z jakiegoś powodu nie jest już w dokumentacji findNonZero.

2

Każdy, kto chce to zrobić w python. można to zrobić również za pomocą numpy arrays i dlatego nie musisz aktualizować swojej wersji opencv (lub używać nieudokumentowanych funkcji).

mask = np.zeros(imgray.shape,np.uint8) 
cv2.drawContours(mask,[cnt],0,255,-1) 
pixelpoints = np.transpose(np.nonzero(mask)) 
#pixelpoints = cv2.findNonZero(mask) 

Skomentowana to ta sama funkcja z użyciem metody openCV. Aby uzyskać więcej informacji zobacz:

https://github.com/abidrahmank/OpenCV2-Python-Tutorials/blob/master/source/py_tutorials/py_imgproc/py_contours/py_contour_properties/py_contour_properties.rst

9

Podałem to jako Edytowanie w odpowiedzi Alex, to nie dostać recenzja chociaż więc będę pisać tutaj, jak to jest przydatne informacje imho.

Można również przekazać wektor punktów, sprawia, że ​​łatwiej zrobić coś z nimi potem:

std::vector<cv::Point2i> locations; // output, locations of non-zero pixels 
cv::findNonZero(binaryImage, locations); 

Jedna uwaga dla funkcji w ogóle cv::findNonZero: jeśli binaryImage zawiera zero elementy niezerowe, to będzie throw, ponieważ próbuje przydzielić pamięć "1 xn", gdzie n to cv::countNonZero, a n będzie oczywiście wynosić 0. Unikam tego ręcznie, dzwoniąc pod numer cv::countNonZero, ale tak naprawdę nie lubię tego rozwiązania.

Powiązane problemy