2013-03-05 51 views
11

如何找到二進制圖像(cv :: Mat)中所有非零像素的位置?我是否必須掃描圖像中的每個像素,還是有可用的高級別OpenCV函數?輸出應該是點(像素位置)的矢量。OpenCV - 二進制圖像中所有非零像素的位置

例如,這可以在Matlab進行簡單的:

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

,或者更簡單

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

編輯:換句話說,如何找到所有非座標零元素在cv :: Mat中?

+1

你使用哪個版本的opencv?在2.4.4 python版本中,我可以找到類似的函數「cv2.findNonzero」,這意味着它也應該在C++中。但它不在文檔中。因此安裝2.4.4並檢查該功能。 – 2013-03-05 18:32:25

+0

Thx,在我的OpenCV版本2.4.2(C++)中沒有cv :: findNonzero。 – Alexey 2013-03-05 19:20:51

+0

我認爲它在2.4.4。我從2.4.4 python版本中得到它。所以,如果你想使用它,你可能會更新到2.4.4 – 2013-03-05 19:22:39

回答

10

正如@AbidRahmanK所建議的,在OpenCV版本2.4.4中有一個函數cv::findNonZero。使用方法:

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

它完成這項工作。此功能在OpenCV 2.4.4版中引入(例如,它在2.4.2版中不可用)。此外,截至目前findNonZero由於某種原因未在文檔中。

2

任何想在python中這樣做的人。它也可以用numpy數組來完成,因此你不需要升級你的opencv版本(或者使用未公開的函數)。

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

註釋掉是使用openCV代替的相同函數。欲瞭解更多信息,請參閱:

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

9

我把這個在Alex的答案編輯,它沒有得到審查,雖然,所以我會張貼在這裏,因爲它是有用的信息,恕我直言。

您也可以通過點的載體,可以更容易地做一些與他們算賬:對於一般的cv::findNonZero功能

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

一個注意:如果binaryImage包含零非零元素,它會因爲它試圖分配'1 xn'內存,其中n是cv::countNonZero,並且n顯然將是0。我通過預先手動呼叫cv::countNonZero來規避這種情況,但我並不太喜歡這種解決方案。

相關問題