【问题标题】:Creating a vector(array) of CvSVM vector创建 CvSVM 向量的向量(数组)
【发布时间】:2016-01-22 17:13:46
【问题描述】:

我想知道创建“CvSVM”对象的向量。我试过使用:

vector<CvSVM> svm_bank;

但每当我使用:

new_model.train(training_inputs, targets, Mat(), Mat(), svm_params);
svm_bank.push_back(new_model);

我得到这个错误:

c:\program 文件 (x86)\microsoft visual studio 12.0\vc\include\xmemory0(593): 错误 C2248: 'CvSVM::CvSVM' : 无法访问在类 'CvSVM' 中声明的私有成员

我使用 Visual Studio 2013,OpenCV 版本 2.4.11。

【问题讨论】:

  • 你声明你的构造函数private了吗?

标签: c++ opencv vector svm


【解决方案1】:

我找到了解决方案。这是三木的修改版。由于 Miki 的代码正在编译,但在执行代码时出现了运行时错误。

这样就解决了问题。

#include <opencv2\opencv.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main()
{
    vector<Ptr<SVM>> svm_bank;

    for (int i = 0; i < 3; ++i)
    {
        Mat trainData;
        Mat responses;

        /*Code for trainingData and 
        responses */

        SVM *new_model;
        new_model = new SVM;
        new_model->train(trainData, responses);

        svm_bank.push_back(new_model);
    }

    for (int i = 0; i < 3; ++i)
    {
        Mat samples;
        Mat results;
        svm_bank[i]->predict(samples, results);
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    std::vector::push_back 将尝试调用复制构造函数,如您所见,in the header 被标记为私有。

    我建议使用emplace_back(),它在添加对象时直接构造对象。存在直接调用 train() 的构造函数重载,因此这是一种选择。

    svm_bank.emplace_back(training_inputs, targets, Mat(), Mat(), svm_params);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      相关资源
      最近更新 更多