2017-04-08 6 views
0

1800 * 160私は列車のsvmが必要ですが、私はOPENCV SVMを使用しますが、デバッグモードではSVM-> trainを返します。モードこのexeptionが提起:svm->列車で例外を起こす列車

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

私のコード:berakのsolution

あなたへ

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

感謝が犯人で、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] 
関連する問題