opencv的矩阵元素的列总和(Column sum of Opencv Matrix elemen

2019-08-01 08:56发布

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

现在,我使用:

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

问题是,我的程序需要相当长的时间来运行。 这部分是可疑导致这种之一。 你可以建议任何可能更快地实现???

谢谢!!!

Answer 1:

你需要一个CV ::减少 :

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


Answer 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()由安德烈建议)是更可读,我发现它比你甚至在某些情况下,实现慢。



Answer 3:

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


文章来源: Column sum of Opencv Matrix elements