2016-01-22 133 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的参数。