12

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

现在我正在使用:

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

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

谢谢!!!

4

3 回答 3

39

你需要一个cv::reduce

cv::reduce(cross_corr, cross_corr_summed, 0, CV_REDUCE_SUM, CV_32S);
于 2012-10-11T07:03:40.533 回答
2

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

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 建议)更具可读性,但我发现它在某些情况下甚至比您的实现还要慢。

于 2012-10-11T18:01:41.973 回答
0
Mat originalMatrix;    
Mat columnSum;    
for (int i = 0; i<originalMatrix.cols; i++)    
     columnSum.push_back(cv::sum(originalMatrix.col(i))[0]);    
于 2014-07-15T19:32:39.750 回答