2011-12-07 12 views
5

में 'सफेद' पिक्सेल की गणना करें मैं ओपनसीवी बाइनरी छवि में सभी सफेद पिक्सेल गिनने की कोशिश कर रहा हूं।ओपनसीवी बाइनरी छवि (कुशलतापूर्वक)

whitePixels = 0; 
    for (int i = 0; i < height; ++i) 
    for (int j = 0; j < width; ++j) 
     if (binary.at<int>(i, j) != 0) 
     ++whitePixels; 

हालांकि, gprof मैं पाया है कि इस कोड का एक बहुत ही धीमी गति टुकड़ा, और कार्यक्रम में एक बड़ी अड़चन है के साथ की रूपरेखा के बाद: मेरे वर्तमान कोड इस प्रकार है।

क्या कोई ऐसी विधि है जो समान मूल्य की गणना कर सकती है?

+0

क्या आपने ऊंचाई और चौड़ाई को बदलने का प्रयास किया था? मेरा मतलब चौड़ाई और फिर ऊंचाई पर लूपिंग है? यह लूप में सुधार कर सकता है, यह निर्भर करता है कि स्मृति में छवि को कैसे रखा गया है। –

+2

क्या आप इसके बजाय() फ़ंक्शन पर सीधे छवि डेटा तक पहुंच सकते हैं? – jrok

+0

जेरोक सुझावों के रूप में करना संभवतः तेज़ होगा। मुझे आश्चर्य है कि [यह faq प्रविष्टि] (http://opencv.willowgarage.com/wiki/faq#How_to_access_image_pixels) प्रासंगिक है। – Brian

उत्तर

20

cvCountNonZero। आमतौर पर एक कार्य के ओपनसीवी कार्यान्वयन को अत्यधिक अनुकूलित किया जाता है।

(सी कोड)
+3

@karlphipip का मतलब है ['cv :: countNonZero'] (http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#cv-countnonzero)? –

+0

बिल्कुल सही, एक अनुकूलित, अंतर्निहित फ़ंक्शन। मुझे इसकी ही खोज थी। –

+0

उत्तर देने के लिए वर्तमान दस्तावेज़ लिंक जोड़ा गया (जिसे भविष्य में अपडेट किया जा सकता है, इस टिप्पणी के विपरीत)। – handle

0

आप पैरालेल कंप्यूटिंग का उपयोग कर सकते हैं। आप छवि को एन भागों में विभाजित करते हैं और अपना कोड अलग-अलग थ्रेड में चलाते हैं तो आपको प्रत्येक थ्रेड का परिणाम मिलता है और इसके बाद आप अंततः राशि प्राप्त करने के लिए इन परिणामों को जोड़ सकते हैं।

+1

बिल का एल्गोरिदम शायद सही ढंग से लागू होने पर, सीपीयू-बाउंड के बजाय स्मृति-बाध्य होना चाहिए। एक सामान्य डेस्कटॉप कंप्यूटर पर, आमतौर पर समानांतरता स्मृति-बाध्य कार्यों के लिए सहायक नहीं होती है। – Brian

-2

एक पंक्ति में पिछले पिक्सेल आमतौर पर अगली पंक्ति में पहला पिक्सेल द्वारा पीछा किया जाता है:

limit=width*height; 
i=0; 
while (i<limit) 
{ 
    if (binary.at<int>(0,i) != 0) ++whitePixels; 
    ++i; 
} 
+0

या इसे एक स्लाइडिंग पॉइंटर के रूप में कार्यान्वित करें जो इंडेक्स से दूर हो जाएगा। –

+0

और/या [i] और [i + 1] पर एक समय में परीक्षण करें और सूचकांक/सूचक में 2 जोड़ें। यह आवश्यक लूप को कम करेगा। –

+0

मैकट्रिक्स पर एक निरंतरता परीक्षण किया जाना चाहिए()। यदि मैट्रिक्स निरंतर नहीं है, तो यह विधि विफल हो जाएगी। –

-2

असल binary.at<int>(i, j) धीमी गति से पहुँच है!

यहां एक सरल कोड है जो आपके से तेज़ी से पहुंचता है।

for (int i = 0; i < height; ++i) 
{ 
uchar * pixel = image.ptr<uchar>(i); 
    for (int j = 0; j < width; ++j) 
{ 
    if(pixel[j]!=0) 
    { 
     //do your job 
    } 
} 
} 
संबंधित मुद्दे