2014-01-30 58 views
0

我必須創建在OpenCV的面的SVM檢測。我想分開火車和預測的過程。因此,我想要找到一種方法來存儲在我的硬盤CvSVM SVM對象中,以便每當我想再次使用無需訓練的新模型時訪問它。通過這種方式,我可以通過從硬盤加載SVM對象來使用預測方法。這在Matlab中是非常直接的,但是我怎樣才能在opencv C++中成功呢?存儲在硬盤中的CvSVM對象

使用加載和保存功能,以便加載和保存SVM模型它導致munmap_chunk()::無效的指針信息(檢測到的glibc)消息。

CvSVM SVM = detect.SVMtrain("dbpath/"); 
    SVM.save("svmTrain.xml", 0); 

    cout <<"Detection system in progress progress...\n"; 
    string pathFile = databasePath+ imageFilename; 
    vector<float> confidence; 
    detections = detect.detection(pathFile); 
    CvSVM SVM; 
    SVM.load("svmTrain.xml",0); 
    confidence = detect.SVMpredict(detections.at(0), SVM); 
    //cout << "confidence is: " << confidence.at(0) << endl; 

當我運行上面的代碼時,我收到了上述消息。問題在於svmpredict函數。和SVM預測功能:

vector<float> Detection::SVMpredict(Mat image, CvSVM SVM){ 


vector<float> res; 

//Mat image = imread(fileName,0); //Read as a gray image 
//cvtColor(sampleMat, sampleMat, CV_BGR2GRAY); 
image = eigenfacesExtraction(image); 
image.convertTo(image, CV_32FC1); // <-- Convert to CV_32F for matrix mult 

float response = SVM.predict(image); res.push_back(response); 
float val = SVM.predict(image,true); res.push_back(val); 
cout << "svm result: "<< response <<" val: "<< val << endl; 

return res; 

} 

回答

1

也很簡單。這是一個CvStatModel,所以它配備了saveload方法。

+0

所以保存和載入它可能喜歡這個SVM.load(「.. .XML」); //保存 –

+1

這是想法,是的。或.yaml IIRC。 – MSalters

+0

當我的svmpredict計算我得到一個在glibc之後使用負載檢測mun_map_chunk()無效指針: –