【问题标题】:svm->train raise exception with out trainsvm->train 在没有火车的情况下引发异常
【发布时间】:2017-09-03 14:32:36
【问题描述】:

我有vector<vector<float> > 大小的特征 1800*160 现在我需要在上面训练 svm,我尝试使用 OPENCV SVM 但在调试模式下 svm->train 返回 false 并在发布模式下引发异常:

Exception thrown at 0x00007FFF587AC387 (vcruntime140.dll):Access violation reading location 0x00000048B7FED000. 

我的代码:

void Classifier::trainSVM(vector<vector<float> > data,cv::Mat Lable)
{
    // Train the SVM
    cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
    svm->setType(cv::ml::SVM::C_SVC);
    svm->setKernel(cv::ml::SVM::LINEAR);
    svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 50000, 1e-6));
    cv::Mat trainingData = cv::Mat(data.size(), 160, CV_32FC1, data.data());
    std::cout << "\nBegan Training Svm in vector faces.";
    bool trained = svm->train(trainingData, cv::ml::ROW_SAMPLE, Lable);
    if (trained)
        svm->save("svm_data.xml");
    std::cout << "\nEnd Training Svm in vector faces.";

}

【问题讨论】:

  • 您是否在调试模式下链接发布库?

标签: c++ opencv svm


【解决方案1】:

感谢berak的solution

你的vector&lt;vector&lt;float&gt;&gt; 是罪魁祸首,opencv 的机器学习需要一个具有连续数据的 Mat。

你需要将它复制到一个 Mat 中,每个向量都在一行中,可能是这样的:

vector<vector<float>> vf {{1,2,3},{4,5,6},{7,8,9}}; // demo data

Mat data;
for ( auto v : vf ) {
    Mat row = Mat(v, true).reshape(1,1); // deep copy, reshape to row
    data.push_back(row);
}

cerr << data << endl;

[1, 2, 3;
 4, 5, 6;
 7, 8, 9]

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多