12 votes

Somme des colonnes des éléments de la matrice Opencv

J'ai besoin de calculer la somme des éléments de toutes les colonnes séparément.

Maintenant, j'utilise :

La matrice cross_corr doit être additionnée.

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

Le problème est que mon programme prend beaucoup de temps à s'exécuter. C'est l'une des parties qui est suspectée de causer cela. Pouvez-vous me conseiller une mise en œuvre plus rapide ? ???

Merci ! !!

39voto

Andrey Kamaev Points 14888

Vous avez besoin d'un cv::reduce :

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

2voto

Aurelius Points 10621

Si vous savez que vos données sont continues et à canal unique, vous pouvez accéder directement aux données de la matrice :

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

ce qui sera plus rapide que votre utilisation de .at_<float>() . En général, j'évite l'utilisation de .at() chaque fois que possible, car il est plus lent que l'accès direct.

En outre, bien que cv::reduce() (suggérée par Andrey) est beaucoup plus lisible, j'ai constaté qu'elle est plus lente que votre implémentation dans certains cas.

0voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X