2012-09-20 6 views
6

Esto debería ser obvio, pensé. Pero no puedo encontrar una manera fácil de encontrar el máximo entre todos los píxeles en una Mat de OpenCV. Por supuesto, puedo hacer lo siguiente para cada tipo de píxel. Pero la función máxima general sería útil.Cómo calcular el valor máximo de píxeles de Mat en 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; 
} 

Respuesta

17

Siempre se puede utilizar la función std max_element con iteradores de OpenCV

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

Probablemente vale la pena mencionar que max_element devuelve un iterador. – twerdster

+0

Una nota: espero que el iterador Mat sea bastante lento, ya que en cada incremento debe verificar si llegó al final de una fila (Matrix podría ser discontinuo, y también podría haber bytes de relleno) – Antonio

9

También hay cv :: minMaxLoc función de construir-en el que podría utilizar. std :: max_element es más simple en tu caso.

9

cv::minMaxIdx es realmente simple de usar. Se ve complicada en la documentación, pero se puede omitir la mayoría de los parámetros:

Mat m = ...; 

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

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

Por otra parte, cv::minMaxIdx es más de 10 veces más rápido que std::max_element. Esto se debe a que cv::minMaxIdx está optimizado para manejar datos de cv::Mat y, si es posible, usa varios subprocesos.

Si también necesita las ubicaciones del mínimo y máximo en la imagen, puede usar cv::minMaxLoc.

Cuestiones relacionadas