Hill
Hill

Reputation: 21

failed to generate the SVM.xml file

Recently i am studying the SVM,and now i need to try my own SVM.xml,fortunately the book,"Master Opencv with pratical project" has offered a TrainSVM.cpp file to generate the SVM.xml file,i build a project with the TrainSVM.cpp file,but nothing generated after runing this project,how could i get this SVM.xml file?Code as follows:

#include <cv.h>
 #include <highgui.h>
 #include <cvaux.h>

 #include <iostream>
 #include <vector>

 using namespace std;
 using namespace cv;

 int main ( int argc, char** argv )
 {
    cout << "OpenCV Training SVM Automatic Number Plate Recognition\n";
    cout << "\n";

    char* path_Plates;
    char* path_NoPlates;
    int numPlates;
    int numNoPlates;
    int imageWidth=144; 
    int imageHeight=33; 

    //Check if user specify image to process
    if(argc >= 5 )
    {
        numPlates= atoi(argv[1]);
        numNoPlates= atoi(argv[2]);
        path_Plates= argv[3];
        path_NoPlates= argv[4];

    }else
    {
        cout << "Usage:\n" << argv[0] << " <num Plate Files> <num Non Plate Files> <path to plate folder files> <path to non plate files> \n";
        return 0;
    }        

    Mat classes;//(numPlates+numNoPlates, 1, CV_32FC1);
    Mat trainingData;//(numPlates+numNoPlates, imageWidth*imageHeight, CV_32FC1    );

    Mat trainingImages;
    vector<int> trainingLabels;

    for(int i=0; i< numPlates; i++)
    {

        stringstream ss(stringstream::in | stringstream::out);
        ss << path_Plates << i << ".jpg";
        Mat img=imread(ss.str(), 0);
        img= img.reshape(1, 1);
        trainingImages.push_back(img);
        trainingLabels.push_back(1);
    }

    for(int i=0; i< numNoPlates; i++)
    {
        stringstream ss(stringstream::in | stringstream::out);
        ss << path_NoPlates << i << ".jpg";
        Mat img=imread(ss.str(), 0);
        img= img.reshape(1, 1);
        trainingImages.push_back(img);
        trainingLabels.push_back(0);

    }

    Mat(trainingImages).copyTo(trainingData);
    //trainingData = trainingData.reshape(1,trainingData.rows);
    trainingData.convertTo(trainingData, CV_32FC1);
    Mat(trainingLabels).copyTo(classes);

    FileStorage fs("SVM.xml", FileStorage::WRITE);
    fs << "TrainingData" << trainingData;
    fs << "classes" << classes;
    fs.release();

    return 0;
    }

Upvotes: 0

Views: 114

Answers (1)

sturkmen
sturkmen

Reputation: 3550

first you need some positive and negative images named like 0.jpg 1.jpg ...n.jpg in two directories ( say dir names pos and neg and you have 30 positive and 30 negative images )

you should run the program like

trainSVM 30 30 ./pos/ ./neg/

i looked at mentioned book's repo . there is no sample positive and neative images. i prepared sample images to test. you can find here

the output SVM.xml contains TrainingData and labels. you should train SVM to use it. look main.cpp

Upvotes: 0

Related Questions