关于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");
}