2013-03-05 11 views
11

मैं बाइनरी छवि (सीवी :: मैट) में सभी गैर-शून्य पिक्सल के स्थान कैसे ढूंढ सकता हूं? क्या मुझे छवि में प्रत्येक पिक्सेल से स्कैन करना है या क्या उच्च स्तर का ओपनसीवी फ़ंक्शन उपयोग किया जा सकता है? आउटपुट अंक (पिक्सेल स्थानों) का एक वेक्टर होना चाहिए।ओपनसीवी - बाइनरी छवि में सभी गैर-शून्य पिक्सेल के स्थान

उदाहरण के लिए, यह बस के रूप में Matlab में किया जा सकता:

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

या, और भी आसान

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

संपादित: दूसरे शब्दों में, कैसे सभी गैर के निर्देशांक को खोजने के लिए सीवी :: मैट में शून्य तत्व?

+1

ओपनसीवी का कौन सा संस्करण आप उपयोग करते हैं? 2.4.4 पायथन संस्करण में, मुझे एक समान कार्य "cv2.findNonzero" मिल सकता है, इसका मतलब है कि यह सी ++ में भी होना चाहिए। लेकिन यह दस्तावेज़ों में नहीं है। तो 2.4.4 इंस्टॉल करें और उस फ़ंक्शन को चेक करें। –

+0

Thx, मेरे पास ओपनसीवी संस्करण 2.4.2 (सी ++) में कोई सीवी :: findNonzero नहीं है। – Alexey

+0

मुझे लगता है कि यह 2.4.4 में आता है। मुझे 2.4.4 पायथन संस्करण से मिला। तो यदि आप इसका उपयोग करना चाहते हैं, तो आप 2.4.4 –

उत्तर

10

जैसा कि @AbidRahmanK द्वारा सुझाया गया है, ओपनसीवी संस्करण 2.4.4 में एक फ़ंक्शन cv::findNonZero है। उपयोग:

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

यह काम करता है। यह फ़ंक्शन ओपनसीवी संस्करण 2.4.4 में प्रस्तुत किया गया था (उदाहरण के लिए, यह संस्करण 2.4.2 में उपलब्ध नहीं है)। इसके अलावा, अब तक findNonZero किसी कारण से दस्तावेज़ में नहीं है।

2

कोई भी पाइथन में ऐसा करने की तलाश में है। यह numpy arrays के साथ ऐसा करना भी संभव है और इसलिए आपको अपने ओपनसीवी संस्करण को अपग्रेड करने की आवश्यकता नहीं है (या अनियंत्रित फ़ंक्शंस का उपयोग करें)।

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

टिप्पणी की गई ओपनसीवी का उपयोग करके एक ही कार्य है। अधिक जानकारी के लिए देखें:

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

9

मैं एलेक्स के जवाब में एक संपादन के रूप में इस रखा है, यह हालांकि तो मैं इसे यहाँ पोस्ट करेंगे, यह उपयोगी जानकारी imho है के रूप में की समीक्षा की नहीं जा सके थे। सामान्य रूप में cv::findNonZero समारोह के लिए

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

एक टिप्पणी:

तुम भी अंक का एक वेक्टर पारित कर सकते हैं, यह आसान बाद में उन लोगों के साथ कुछ करने के लिए करता है तो binaryImage शून्य गैर शून्य तत्व शामिल हैं, यह फेंक दें क्योंकि यह '1 एक्सएन' मेमोरी आवंटित करने का प्रयास करता है, जहां n cv::countNonZero है, और n स्पष्ट रूप से 0 होगा। मैं पहले से ही cv::countNonZero पर मैन्युअल रूप से कॉल करके इसे बाधित करता हूं लेकिन मुझे वास्तव में उस समाधान को बहुत पसंद नहीं है।

संबंधित मुद्दे