2016-01-22 135 views
1

我正在使用Visual Studio 2010和OpenCV 3.0。我試圖訓練SVM並將其保存到文件中,但是我遇到了問題。培訓SVM並將其與OpenCV 3.0保存在一起

我的目的是提取一些圖像的HOG特徵並與它們一起訓練SVM。一切似乎是正確的,但是當我嘗試將模型保存在一個XML文件,我得到了以下錯誤:

Unhandled exception in 0x000007fefd9bb16d (KernelBase.dll) in TrainSVM.exe: Exception de MICROSOFT C++: cv::Exception at memory location 0x0026e1b0.

然後這是在控制檯顯示:

OpenCV Error: Parsing error (SVM model data is invalid, check sv_count, var_* an d class_count tags) in cv::ml::SVMImpl::write, file C:\builds\master_PackSlave-w in64-vc12-shared\opencv\modules\ml\src\svm.cpp, line 2027

的錯誤似乎當SVM未被正確訓練時出現,但我不明白我的失敗位置,因爲線

svm->train(auxResult)

結果爲「true」。

我檢查了圖像,它們裝載正確,有人可以幫我嗎?

在此先感謝。

下面是代碼:

String imagesPathPos = "Positivas/*.jpg"; // it has filters, too ! 
    vector<String> fp; 
    glob(imagesPathPos, fp); 
    int tamaño = fp.size(); 

    std::vector<cv::Point> positions; 
    positions.push_back(cv::Point(0,0)); 
    std::vector<float> descriptor; 
    Ptr<TrainData> auxResult; 

    for (size_t i=0; i<fp.size(); ++i) 
    { 
     string nameFile = fp[i]; 
     Mat img = imread(fp[i]);  
     cv::Mat grayImg; 
     cvtColor(img, grayImg, COLOR_BGR2GRAY);   

     hog.compute(grayImg,descriptor,winStride,trainingPadding,positions); 

     Mat auxDescriptor = cv::Mat(descriptor); 
     Mat descriptorMat(1,auxDescriptor.rows,CV_32FC1); 
     transpose(auxDescriptor, descriptorMat); 
     trainingData.push_back(descriptorMat);   
     trainingLabels.push_back(labelPositive);   
    } 

    String imagesPathNeg = "Negativas/*.jpg"; 
    vector<String> fn; 
    glob(imagesPathNeg, fn, true); 
    for (size_t i=0; i<fn.size(); i++) 
    { 
     Mat img = imread(fn[i]); 
     cv::Mat grayImg; 
     cvtColor(img, grayImg, COLOR_BGR2GRAY); 
     hog.compute(grayImg,descriptor,Size(),Size(),positions); 

     Mat auxDescriptor = cv::Mat(descriptor); 
     Mat descriptorMat(1,auxDescriptor.rows,CV_32FC1); 
     transpose(auxDescriptor, descriptorMat); 
     trainingData.push_back(descriptorMat); 
     trainingLabels.push_back(labelPositive); 
    } 

    auxResult = TrainData::create(trainingData, type, trainingLabels); 

    svm->train(auxResult); 

    svm->save("output.xml"); 
+0

@Noripsni我看到你發佈[這裏](http://stackoverflow.com/questions/30727369/loading-pretrained-opencv-yml-in-java)類似的錯誤,你有解決它嗎? – JoseleMG

回答

0

你定義 「labelPositive」 即使圖像是否定的。可能的誤差是存在的,通過矢量循環FN內:

trainingLabels.push_back(labelPositive);

你應該使用名爲「labelNegative」定義爲-1的參數。