使用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是用来将向量进行分类的,这也就意味着我们训练和分类的数据必须是向量。
这个是我进行样本获取的例子
接下来是训练和预测
首先我们必须了解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"); }
相关文章推荐
- Linux内核部件分析 记录生命周期的kref
- Linux内核部件分析 原子性操作atomic_t
- Linux内核部件分析 连通世界的list
- Linux内核部件分析 设备驱动模型之device-driver
- Linux内核部件分析 设备驱动模型之bus
- Linux下静态IP地址的设置及TFTP服务的搭建
- linux信号
- Linux学习----grep及正则表达式
- Linux 硬件信息
- 命令行模式的Linux小结
- nginx+uwsgi部署django
- Linux 系统应用编程——进程间通信(下)
- Linux 系统应用编程——多线程经典问题(生产者-消费者)
- Linux---进程调度相关命令解析
- Linux time()函数解析
- Hadoop 调研笔记
- Keealived+LVS 维护技巧与调优
- linux dup函数源码剖析
- shell_sed_awk使用
- linux下开启日志查询