您的位置:首页 > 运维架构

使用opencv下的SVM分类器

2016-06-19 10:49 387 查看
关于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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: