使用opencv下的SVM分类器

关于svm分类器的基本原理,请参 考http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html。对于一般使用来说只需要知道它可以在训练之后进行数据分类就可以了。opencv内置了SVM的函数,接下来是如何使用。
首先我们必须了解SVM是用来将向量进行分类的,这也就意味着我们训练和分类的数据必须是向量。

这个是我进行样本获取的例子

vector<string> path_name;

void dir(string path)
{
    long hFile = 0;
    struct _finddata_t fileInfo;
    string pathName, exdName;

    if ((hFile = _findfirst(pathName.assign(path).append("\\*").c_str(), &fileInfo)) == -1) {
        return;
    }
    do {
        cout << fileInfo.name<< endl;
        path_name.push_back(fileInfo.name);
    } while (_findnext(hFile, &fileInfo) == 0);
    _findclose(hFile);
    return;
}

int main()
{

    string path="C:\\Users\\mask\\Desktop\\AR\\SVM\\SVM\\trainData";
    dir(path);

    Mat classes;

    Mat trainingImages;
    vector<int> trainingLabels;

    int size;
    int n=0;

    for (int i = 2; i < path_name.size()-1; i++)
    {
        Mat img=imread("trainData\\"+path_name[i], 0);
        imshow("pic",img);
        img= img.reshape(1, 1);
        size=img.cols;
        trainingImages.push_back(img);
        if (cvWaitKey(-1)=='y')
        {
            trainingLabels.push_back(1);
        }
        else
        {
            trainingLabels.push_back(0);
        }
        n++;
    }

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

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

    return 0;
}

接下来是训练和预测

int main()
{
    Mat input = imread("Car_14.bmp",0);
    FileStorage fs;
    fs.open("SVM.xml", FileStorage::READ);
    Mat SVM_TrainingData;
    Mat SVM_Classes;
    fs["TrainingData"] >> SVM_TrainingData;
    fs["classes"] >> SVM_Classes;
    CvSVMParams SVM_params;
    SVM_params.svm_type = CvSVM::C_SVC;
    SVM_params.kernel_type = CvSVM::LINEAR;
    SVM_params.degree = 0;
    SVM_params.gamma = 1;
    SVM_params.coef0 = 0;
    SVM_params.C = 1;
    SVM_params.nu = 0;
    SVM_params.p = 0;
    SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
    CvSVM svmClassifier(SVM_TrainingData, SVM_Classes, Mat(), Mat(), SVM_params);

    Mat img=input;
    Mat p= img.reshape(1,1);
    p.convertTo(p,CV_32FC1);
    int response = (int)svmClassifier.predict( p );
    printf("分类结果:%d\n",response);
    system("pause");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值