2017-04-08 56 views
0

我有特点vector<vector<float> >大小1800 * 160现在我需要训练支持向量机就可以了,我尝试使用OPENCV SVM,但在调试模式svm->火车返回false,并释放该模式提出exeption:svm->用了火车的火车引发异常

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."; 

} 
+0

你所链接的释放库? –

回答

0

感谢berak的solution

vector<vector<float>>是罪魁祸首,opencv的机器学习预计会有连续数据的单个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]