2012-09-20 602 views
6

這應該是顯而易見的,我想。但是我找不到在OpenCV Mat中所有像素中找到最大值的簡單方法。當然,我可以爲每種像素類型進行跟蹤。但一般的最大功能仍然有用。如何計算OpenCV中Mat的最大像素值

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

你總是可以用迭代器使用std max_element功能從OpenCV的

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

值得一提的是,max_element返回一個迭代器。 – twerdster

+0

一個注意:我期望Mat迭代器非常慢,因爲在每個增量處它必須檢查是否到達行的末尾(Matrix可能不連續,並且可能還有填充字節) – Antonio

9

還有CV :: 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::minMaxIdxstd::max_element快10倍以上。這是因爲cv::minMaxIdx針對處理cv::Mat數據進行了優化,並且如果可能的話,它使用多個線程。

如果您還需要圖像中最小和最大位置,可以使用cv::minMaxLoc