aihot  2017-05-27 19:48:46  OpenCV |   查看评论   
  • #include<opencv2/.hpp>
  •  #include"stdafx.h"
  • #include<cmath>
  • #include<ctime>
  • using namespace std;
  • int _tmain(int argc,_TCHAR*argv[])
  • {
  •     intsize = 400;//图像的长度和宽度  
  •     constints = 1000;//试验点个数  
  •     inti,jsv_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(imgcvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(255, 0, 0));
  •             cvLine(imgcvPoint(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(imgcvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(0, 255, 0));
  •                 cvLine(imgcvPoint(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(imgcvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(0, 0, 255));
  •                 cvLine(imgcvPoint(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,NULLcriteria);
  •    
  •     //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_32FC1a);
  •  
  •             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(imgijrcolor);
  •         }
  •     }
  •  
  •     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(imgcvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),rcolor);
  •         cvLine(imgcvPoint(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(imgcvPoint((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的使用

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]