- #include<opencv2/.hpp>
- #include"stdafx.h"
- #include<cmath>
- #include<ctime>
- using namespace std;
- int _tmain(int argc,_TCHAR*argv[])
- {
- intsize = 400;//图像的长度和宽度
- constints = 1000;//试验点个数
- inti,j, sv_num;
- IplImage *img;
- CvSVMsvm =CvSVM();//构造一个SVM类对象
- CvSVMParamsparam;//SVM参数
- CvTermCriteriacriteria;//迭代的结束条件
- CvRNGrng =cvRNG(time(NULL));//随机数typedef uint64 CvRNG;
- CvPointpts[s];
- floatdata[s*2];
- intres[s];
- CvMatdata_mat,res_mat;
- CvScalarrcolor;
- constfloat *support;
- img =cvCreateImage(cvSize(size,size),IPL_DEPTH_8U, 3);
- cvSetZero(img);
- //训练数据的生成,并将其值存放在pts中
- for (i=0;i<s;i++)
- {
- pts[i].x =cvRandInt(&rng) %size;//用随机整数赋值
- pts[i].y =cvRandInt(&rng) %size;
- if (pts[i].y > 50 *cos(pts[i].x *CV_PI / 100) + 200)
- {
- cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(255, 0, 0));
- cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),CV_RGB(255, 0, 0));
- res[i] = 1;
- }
- else
- {
- if (pts[i].x > 200)
- {
- cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(0, 255, 0));
- cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),CV_RGB(0, 255, 0));
- res[i] = 2;
- }
- else
- {
- cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(0, 0, 255));
- cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),CV_RGB(0, 0, 255));
- res[i] = 3;
- }
- }
- }
- cvNamedWindow("SVM",CV_WINDOW_AUTOSIZE);
- cvShowImage("SVM",img);
- cvWaitKey(0);
- //学习参数的生成
- for (i=0;i<s;i++)
- {
- data[i*2] = float(pts[i].x) /size;
- data[i*2+1] = float(pts[i].y) /size;
- }
- cvInitMatHeader(&data_mat,s, 2,CV_32FC1,data);
- cvInitMatHeader(&res_mat,s, 1,CV_32SC1,res);
- criteria =cvTermCriteria(CV_TERMCRIT_EPS, 1000,FLT_EPSILON);
- param =CvSVMParams(CvSVM::C_SVC,CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1,NULL, criteria);
- //SVM学习
- svm.train(&data_mat, &res_mat,NULL,NULL,param);
- //学习结果绘图
- for (i=0;i<size;i++)
- {
- for (j=0;j<size;j++)
- {
- CvMat m;
- float ret = 0.0;
- float a[] = {float(j) /size,float(i) /size};
- cvInitMatHeader(&m, 1, 2, CV_32FC1, a);
- ret = svm.predict(&m);//预测
- switch ((int)ret)
- {
- case 1: rcolor = CV_RGB(100, 0, 0);break;
- case 2: rcolor = CV_RGB(0, 100, 0);break;
- case 3: rcolor = CV_RGB(0, 0, 100);break;
- }
- cvSet2D(img, i, j, rcolor);
- }
- }
- cvNamedWindow("SVM1",CV_WINDOW_AUTOSIZE);
- cvShowImage("SVM1",img);
- cvWaitKey(0);
- //训练数据绘制
- for (i=0;i<s;i++)
- {
- CvScalar rcolor;
- switch (res[i])
- {
- case 1: rcolor = CV_RGB(255, 0, 0); break;
- case 2: rcolor = CV_RGB(0, 255, 0); break;
- case 3: rcolor = CV_RGB(0, 0, 255); break;
- }
- cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),rcolor);
- cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),rcolor);
- }
- //支持向量绘制
- sv_num =svm.get_support_vector_count();
- for (i=0;i<sv_num;i++)
- {
- support = svm.get_support_vector(i);
- cvCircle(img, cvPoint((int)(support[0] *size), (int)(support[1] *size)), 5, CV_RGB(200, 200, 200));
- }
- cvNamedWindow("SVM2",CV_WINDOW_AUTOSIZE);
- cvShowImage("SVM2",img);
- cvWaitKey(0);
- cvDestroyWindow("SVM");
- cvDestroyWindow("SVM1");
- cvDestroyWindow("SVM2");
- cvReleaseImage(&img);
- return 0;
- }
除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV中SVM的使用