Opencv Matrix元素的列和

时间:2012-10-11 06:42:38

标签: opencv matrix sum

我需要分别计算所有列中元素的总和。

现在我正在使用:

矩阵cross_corr应该相加。

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

问题是我的程序运行需要很长时间。这是导致这种情况可疑的部分之一。 你能否建议任何可能更快的实施???

感谢!!!

3 个答案:

答案 0 :(得分:27)

您需要cv::reduce

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

答案 1 :(得分:1)

如果您知道数据是连续且单通道的,则可以直接访问矩阵数据:

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

比使用.at_<float>()更快。一般来说,我尽量避免使用.at()因为它比直接访问慢。

此外,虽然cv::reduce()(由Andrey提出)更具可读性,但我发现它在某些情况下甚至比你的实现更慢。

答案 2 :(得分:0)

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