Opencv矩阵元素的列求和

13

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

现在我正在使用:

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

我的程序运行时间很长,有一部分很可能是原因之一。您能否提供任何可能的更快实现方式吗?

谢谢!!!


可能是OpenCV每列求和的重复问题 - kiranpradeep
3个回答

41
你需要使用 cv::reduce函数:
cv::reduce(cross_corr, cross_corr_summed, 0, CV_REDUCE_SUM, CV_32S);

cv::sum更简单。 - mrgloom
1
cv::sum 无法沿特定维度应用。 - Markus Dutschke

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(),因为它比直接访问要慢。

另外,虽然Andrey建议使用cv::reduce(),这种方法更易读,但在某些情况下,我发现它比您的实现还要慢。


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

1
它不如cv::reduce()好用。尽管如此,我仍然试图避免多次使用for循环,以及使用.at<>。 - user3693028

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接