2012-09-20 18 views
6

To powinno być oczywiste, pomyślałem. Ale nie mogę znaleźć łatwego sposobu znalezienia maksimum wśród wszystkich pikseli w macie OpenCV. Oczywiście mogę wykonać następujące czynności dla każdego typu piksela. Ale ogólna funkcja max będzie nadal przydatna.Jak obliczyć maksymalną wartość pikseli Mat w OpenCV

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; 
} 

Odpowiedz

17

Zawsze można użyć std max_element funkcję z iteratorów z OpenCV

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

Warto wspomnieć, że max_element zwraca iterator. – twerdster

+0

Jedna uwaga: Spodziewam się, że iterator Mat będzie dość powolny, ponieważ przy każdym przyrostie musi sprawdzić, czy dotarłeś do końca wiersza (Macierz może być nieciągła i mogą być również bajty dopełnienia) – Antonio

9

Istnieje również cv :: minMaxLoc funkcja wbudowany można użyć. std :: max_element jest prostszy w twoim przypadku.

9

cv::minMaxIdx jest naprawdę prosty w użyciu. Wygląda na skomplikowane w docs, ale można pominąć większość parametrów:

Mat m = ...; 

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

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

Ponadto cv::minMaxIdx jest ponad 10-krotnie szybciej niż std::max_element. Dzieje się tak, ponieważ cv::minMaxIdx jest zoptymalizowany do obsługi danych cv::Mat i jeśli to możliwe, używa wielu wątków.

Jeśli potrzebujesz również lokalizacji minimalnej i maksymalnej na obrazie, możesz użyć cv::minMaxLoc.

Powiązane problemy