OpenCV

2013-06-04 16 views
7

का उपयोग कर बाइनरी छवि में सफेद पिक्सेल की संख्या प्राप्त करने का सबसे तेज़ तरीका OpenCV का उपयोग करके बाइनरी चित्र में सफेद पिक्सल की संख्या प्राप्त करने का सबसे तेज़ तरीका क्या है? लूप के लिए दो का उपयोग करने और पिक्सेल द्वारा छवि पिक्सेल तक पहुंचने से कुछ तेज है?OpenCV

+0

क्या असली ग्रेस्केल में छवि है, या यह एक बाइनरी छवि है? – Aurelius

+0

@Aurelius: यह वास्तव में बाइनरी छवि है, मुझे इस सवाल में लिखा जाना चाहिए था। – xx77aBs

उत्तर

11

यह पूरा करने के सबसे संक्षिप्त तरीका है:

cv::Mat image, mask; //image is CV_8UC1 
cv::inRange(image, 255, 255, mask); 
int count = cv::countNonZero(mask); 

आप एक द्विआधारी छवि पर काम कर रहे हैं, तो cv::inRange() करने के लिए कॉल अनावश्यक है, और बस cv::countNonZero() पर्याप्त होगा।

हालांकि किसी भी विधि को सभी पिक्सल के माध्यम से फिर से शुरू करना चाहिए, यह ओपनसीवी के अंतर्निर्मित parallel_for_() का उपयोग करने में सक्षम हो सकता है, जो समानांतर निष्पादन की अनुमति देता है।

यदि आपकी छवि निरंतर है, तो आप एक ही लूप का उपयोग कर सभी डेटा के माध्यम से पुन: सक्रिय कर सकते हैं।

+0

धन्यवाद, सीवी :: inRange मैं चाहता था! मैं वास्तव में एएमजीसीवी रैपर (सी # में) के माध्यम से ओपनसीवी का उपयोग कर रहा हूं, और इस लाइन ने मेरे कार्यक्रम को लगभग 40% तक बढ़ा दिया। क्या आपको कोई विचार है कि लूप के लिए दो में लूपिंग इतनी धीमी क्यों है? – xx77aBs

+3

मैं सी # से बहुत परिचित नहीं हूं, लेकिन मेरा मानना ​​है कि जब आप एक लूप में पुनरावृत्ति करते हैं तो यह जांच करता है, जो कुछ प्रदर्शन अंतर को समझा सकता है। – Aurelius

+0

धन्यवाद, सीमाओं की जांच वास्तव में चीजों को धीमा कर रही है। लेकिन घटना के बाद मैंने सीमाओं की जांच को अक्षम कर दिया है, एक बहुत बड़ी तस्वीर (10240x7680) सीवी समारोह में लगभग 70 मिमी लगते हैं, और दो लूप के लिए लगभग 350ms लेते हैं। समानांतर उपयोग करने के बाद। दो लूप दृष्टिकोण के बारे में 200ms लिया, लेकिन यह अभी भी ओपनसीवी कार्यान्वयन के लिए बहुत लंबा है। – xx77aBs

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