2012-10-11 37 views
7

Necesito calcular la suma de elementos en todas las columnas por separado.Suma de columna de los elementos de Opencv Matrix

Ahora estoy usando:

cross_corr matriz debe ser resumida.

Mat cross_corr_summed; 
for (int i=0;i<cross_corr.cols;i++)              
    { 
     double column_sum=0; 
     for (int k=0;k<cross_corr.rows;k++) 
     { 
      column_sum +=cross_corr.at<float>(k,i);    
     } 
     cross_corr_summed.push_back(column_sum); 
    } 

El problema es que mi programa tarda bastante tiempo en ejecutarse. Esta es una de las partes sospechosas de causar esto. ¿Puede aconsejar una posible implementación más rápida?

Gracias !!!

+0

posible duplicado de [suma de cada columna opencv] (http://stackoverflow.com/questions/5097416/sum-of-each-column-opencv) – Kiran

Respuesta

24

Se necesita un cv::reduce:

cv::reduce(cross_corr, cross_corr_summed, 0, CV_REDUCE_SUM, CV_32S); 
+0

http://docs.opencv.org/ 2.4/modules/core/doc/operations_on_arrays.html # sum 'cv :: sum' es más simple. – mrgloom

1

Si sabe que sus datos es continua y canalizada sola, puede acceder a los datos de la matriz directamente:

int width = cross_corr.cols; 
float* data = (float*)cross_corr.data; 
Mat cross_corr_summed; 
for (int i=0;i<cross_corr.cols;i++) 
{ 
    double column_sum=0; 
    for (int k=0;k<cross_corr.rows;k++) 
    { 
     column_sum += data[i + k*width]; 
    } 
    cross_corr_summed.push_back(column_sum); 
} 

que será más rápido que su uso de .at_<float>(). En general, evito el uso de .at() siempre que sea posible porque es más lento que el acceso directo.

Además, aunque cv::reduce() (sugerido por Andrey) es mucho más legible, he encontrado que es más lento que incluso su implementación en algunos casos.

0
Mat originalMatrix;  
Mat columnSum;  
for (int i = 0; i<originalMatrix.cols; i++)  
    columnSum.push_back(cv::sum(originalMatrix.col(i))[0]);  
+1

Por favor, explique brevemente por qué esto funciona – rayryeng

+1

No es tan bueno como cv :: reduce(). Aún así, traté de evitar el uso múltiple de for loop, y también el uso de .at <>. – user3693028

Cuestiones relacionadas