2012-09-20 116 views
6

これは明らかであるはずです。しかし、私はOpenCVのMatでは、すべてのピクセルの中で最大値を見つける簡単な方法を見つけることができません。もちろん、ピクセルタイプごとに以下のことを行うことができます。しかし、一般的なmax関数は依然として有用です。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

あなたはいつも品種もあります:: minMaxLocは、ビルドにあなたが使用できる機能OpenCVの

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

おそらく、max_elementがイテレータを返すことに言及する価値があります。 – twerdster

+0

ひとつ:Mat iteratorがかなり遅くなることが予想されます。行の終わりに達した場合にチェックする必要があるごとに(Matrixは不連続で、パディングバイトもあるかもしれません) – Antonio

9

からイテレータでSTD max_element機能を使用することができます。あなたのケースでは、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::minMaxIdxcv::Matデータの処理に最適化されており、可能であれば複数のスレッドを使用するためです。

画像に最小値と最大値の位置が必要な場合は、cv::minMaxLocを使用できます。

関連する問題