【问题标题】:OpenCV mean differentiateOpenCV 均值微分
【发布时间】:2015-09-18 06:23:47
【问题描述】:

我有一个基于列(每列是一个特征)的大型数组(大约 100M),其尺寸为 75000(固定)*样本数

这是数据向量:

std::vector<float> features;

我已使用此代码计算平均值:

cv::Mat data(FEATURE_SIZE, features.size()/FEATURE_SIZE, CV_32F, &features[0]);
cv::reduce(data,dataMeans,1,CV_REDUCE_AVG);

FEATURE_SIZE 是 75000,features 是一个包含所有数据的浮点向量。

为了计算均值偏移,我使用了这个:

data -= cv::repeat(dataMeans,1,features.size()/FEATURE_SIZE);

我认为它试图用我的 features 数组创建一个大小相同的数组,因此给了我一个错误的分配异常。

我只需要该数组是有区别的。有没有什么方法可以在不复制的情况下在同一个内存位置上做到这一点?

【问题讨论】:

    标签: c++ arrays opencv mean


    【解决方案1】:

    首先,您弄乱了列和行。 这是做你想做的事情的正确方法:

    #define FEATURES_SIZE 3
    
    int main()
    {
        vector<float> features = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    
        Mat1f data(features.size() / FEATURES_SIZE, FEATURES_SIZE, &features[0]);
        Mat dataMeans;
        cv::reduce(data, dataMeans, 1, CV_REDUCE_AVG);
        data -= repeat(dataMeans, 1, FEATURES_SIZE);
    }
    

    但是,您的尺寸可能无法使用 opencv 矩阵。 您可以改为使用 std 函数:

    // other includes
    #include <algorithm>
    #include <numeric>
    #include <functional>
    
    
    #define FEATURES_SIZE 3
    
    int main()
    {
        vector<float> features = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
        for(size_t i = 0; i<features.size(); i+= FEATURES_SIZE)
        {
            float cumsum = accumulate(features.begin() + i, features.begin() + i + FEATURES_SIZE, 0.f);
            float avg = cumsum / FEATURES_SIZE;
            transform(features.begin() + i, features.begin() + i + FEATURES_SIZE, features.begin() + i, bind2nd(std::minus<float>(), avg));  
        }
    }
    

    我不知道这是否是“最小份数”的最佳解决方案。尝试使用您的大型阵列并检查是否有问题。

    注意:为简洁起见,我的示例中使用了using namespace std;using namespace cv

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2012-07-12
      • 2016-01-10
      • 2012-06-18
      • 2020-04-30
      • 2018-12-10
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多