2012-09-20 22 views
6

में मैट के अधिकतम पिक्सेल मान की गणना कैसे करें यह स्पष्ट होना चाहिए, मैंने सोचा। लेकिन मुझे ओपनसीवी की एक मैट में सभी पिक्सल के बीच अधिकतम खोजने का आसान तरीका नहीं मिल रहा है। बेशक, मैं प्रत्येक पिक्सेल प्रकार के लिए निम्नलिखित कर सकता हूं। लेकिन सामान्य अधिकतम समारोह अभी भी उपयोगी होगा।ओपनसीवी

double cvMax(cv::Mat& mat) 
{ 
float max=0; 
float* pData=(float*)mat.data; 
for(int i=0;i<mat.rows;i++) 
{ 
    for(int j=0;j<mat.cols;j++) 
    { 
     float value = pData[j+i*mat.cols]; 
     if(value>max) 
     { 
      max=value; 
     } 
    } 
} 
return max; 
} 

उत्तर

17

तुम हमेशा opencv

std::max_element(Mat.begin<double>(),Mat.end<double>()); 
+3

शायद उल्लेखनीय है कि max_element एक पुनरावर्तक देता है। – twerdster

+0

एक नोट: मुझे उम्मीद है कि मैट इटरेटर बहुत धीमी हो, क्योंकि प्रत्येक वृद्धि पर यह जांचना होगा कि क्या आप एक पंक्ति के अंत तक पहुंच गए हैं (मैट्रिक्स असंतुलित हो सकता है, और वहां पैडिंग बाइट भी हो सकते हैं) – Antonio

9

वहाँ भी सीवी है से iterators साथ एसटीडी max_element समारोह इस्तेमाल कर सकते हैं :: minMaxLoc निर्माण में समारोह आप इस्तेमाल कर सकते हैं। std :: max_element हालांकि आपके मामले में सरल है।

9

cv::minMaxIdx उपयोग करने के लिए वास्तव में सरल है। यह डॉक्स में जटिल है, लेकिन आप मापदंडों के सबसे छोड़ सकते हैं:

Mat m = ...; 

double min, max; 
minMaxIdx(m, &min, &max); 

printf("min: %f, max: %f\n", min, max); 

इसके अलावा, cv::minMaxIdx 10 से अधिक बार std::max_element से तेज है। ऐसा इसलिए है क्योंकि cv::minMaxIdx को cv::Mat डेटा को संभालने के लिए अनुकूलित किया गया है और यदि संभव हो तो यह एकाधिक थ्रेड का उपयोग करता है।

यदि आपको छवि में न्यूनतम और अधिकतम स्थानों की भी आवश्यकता है, तो आप cv::minMaxLoc का उपयोग कर सकते हैं।