|
在其他地方看了很多关于支持向量机的介绍,很少有关于利用支持向量机进行图片识别训练的,最近在做这方面,把程序贴出来供大家一块学习讨论。训练的图片大小为50*50,50张图片,训练时间非常快,但是训练的图片太少。大部分解释在程序中已给出。
- #include<opencv2\features2d\features2d.hpp>
- #include<opencv2\core\core.hpp>
- #include<opencv2\highgui\highgui.hpp>
- #include<cv.h>
- #include<opencv.hpp>
- #include<iostream>
- using namespace std;
- using namespace cv;
- int main()
- {
- /*Mat image1=imread("E:\\text/0.jpg",1);
- Mat image2;
- image1.copyTo(image2);
- cvtColor(image1,image2,CV_BGR2GRAY);
- Mat image3=image2.reshape(1,1);
- normalize(image3.clone(), image3, 0, 1, NORM_MINMAX, CV_32FC1);
- if(!image1.data)
- {
- cout<<"Do not find the picture"<<endl;
- return 0;
- }*/
- //设置支持向量机的输入输出量,输入为图片,需要把二维图片转换为一维形式,输入的个数要与输出的个数相同。
- char filename[100];
- //向量机输出量
- int labels[50];
- //向量机输入,为50张图片
- for(int i=0;i<50;i++)
- {
- labels[i]=i/10;
- //cout<<labels[i]<<" "<<endl;
- }
-
- Mat labelsMat(50, 1,CV_32SC1, labels);
- Mat trainingDataMat;
- //读取图片,转换为灰度图,直方图均衡化,矩阵转换为向量,归一化,作为向量机的输入。
- for( int i = 0; i < 50; i++){
- sprintf(filename,"E:\\C++/Testpicture/%d.jpg", i);
- Mat Img = imread(filename, 1);
- Mat gray;
- cvtColor(Img, gray,CV_RGB2GRAY);
- equalizeHist(gray,gray); //直方图均衡化
- Mat ss = gray.clone().reshape(1, 1); //把矩阵转换为向量
- ss.clone().convertTo(ss, CV_32FC1);
- normalize(ss.clone(), ss, 0, 1, NORM_MINMAX, CV_32FC1);
- trainingDataMat.push_back(ss);
- }
- // 设置SVM参数
- CvSVMParams params;
- params.svm_type = CvSVM::C_SVC;//C支持向量分类机,允许用异常值惩罚因子C进行不完全分类
- params.kernel_type = CvSVM::LINEAR;//使用线性内核
- params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);//迭代训练过程的中止条件
- // 对SVM进行训练
- CvSVM SVM;
- SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
-
- //利用训练的向量机预测
- Mat sampleMat=imread("E:\\C++/Testpicture/1.jpg",1);
- cvtColor(sampleMat,sampleMat,CV_RGB2GRAY);
- equalizeHist(sampleMat,sampleMat);
- sampleMat=sampleMat.reshape(1,1);
- normalize(sampleMat, sampleMat, 0, 1, NORM_MINMAX, CV_32FC1);
- int result=SVM.predict(sampleMat);
- ////imshow("showimage",image3);
- //cout<<trainingDataMat.cols<<endl<<trainingDataMat.rows;
- //cout<<trainingDataMat;
- cout<<"训练输出:"<<labelsMat<<endl;
- cout<<"识别结果:"<<result<<endl;
- system("pause");
- waitKey(0);
- }
复制代码 训练把50在图片分为5类,把第一类图片输入进行预测,输出为第一类:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|