您好,欢迎访问一九零五行业门户网

利用SVM解决2维空间向量的3级分类问题

【原文:http://blog.csdn.net/firefight/article/details/6400060】 为了学习opencv svm分类器, 参考网上的 利用svm解决2维空间向量的分类问题 实现并改为c代码,仅供参考 环境:opencv2.2 vs2008 步骤: 1,生成随机的点,并按一定的空间分布将其归类 2,
【原文:http://blog.csdn.net/firefight/article/details/6400060】
为了学习opencv svm分类器, 参考网上的利用svm解决2维空间向量的分类问题实现并改为c++代码,仅供参考
环境:opencv2.2 + vs2008
步骤:
1,生成随机的点,并按一定的空间分布将其归类
2,创建svm并利用随机点样本进行训练
3,将整个空间按svm分类结果进行划分,并显示支持向量
[cpp] view plaincopy
#include stdafx.h  #include     void drawcross(mat &img, point center, scalar color)  {      int col = center.x > 2 ? center.x : 2;      int row = center.y> 2 ? center.y : 2;        line(img, point(col -2, row - 2), point(col + 2, row + 2), color);        line(img, point(col + 2, row - 2), point(col - 2, row + 2), color);    }    int newsvmtest(int rows, int cols, int testcount)  {      if(testcount > rows * cols)          return 0;        mat img = mat::zeros(rows, cols, cv_8uc3);      mat testpoint = mat::zeros(rows, cols, cv_8uc1);      mat data = mat::zeros(testcount, 2, cv_32fc1);      mat res = mat::zeros(testcount, 1, cv_32sc1);        //create random test points      for (int i= 0; i    {           int row = rand() % rows;          int col = rand() % cols;            if(testpoint.atchar>(row, col) == 0)          {              testpoint.atchar>(row, col) = 1;              data.atfloat>(i, 0) = float (col) / cols;               data.atfloat>(i, 1) = float (row) / rows;           }          else          {              i--;              continue;          }            if (row > ( 50 * cos(col * cv_pi/ 100) + 200) )          {               drawcross(img, point(col, row), cv_rgb(255, 0, 0));              res.atint>(i, 0) = 1;           }           else           {               if (col > 200)               {                   drawcross(img, point(col, row), cv_rgb(0, 255, 0));                  res.atint>(i, 0) = 2;               }               else               {                   drawcross(img, point(col, row), cv_rgb(0, 0, 255));                  res.atint>(i, 0) = 3;               }           }         }        //show test points      imshow(dst, img);      waitkey(0);        /////////////start svm trainning//////////////////      cvsvm svm = cvsvm();       cvsvmparams param;       cvtermcriteria criteria;        criteria= cvtermcriteria(cv_termcrit_eps, 1000, flt_epsilon);  /* svm种类:cvsvm::c_svc 
kernel的种类:cvsvm::rbf
degree:10.0(此次不使用) 
gamma:8.0 
coef0:1.0(此次不使用)
c:10.0 
nu:0.5(此次不使用) 
p:0.1(此次不使用) 
然后对训练数据正规化处理,并放在cvmat型的数组里。*/
    param= cvsvmparams (cvsvm::c_svc, cvsvm::rbf, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, null, criteria);       svm.train(data, res, mat(), mat(), param);        for (int i= 0; i    {           for (int j= 0; j        {               mat m = mat::zeros(1, 2, cv_32fc1);              m.atfloat>(0,0) = float (j) / cols;              m.atfloat>(0,1) = float (i) / rows;                float ret = 0.0;               ret = svm.predict(m);               scalar rcolor;                 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;               }                 line(img, point(j,i), point(j,i), rcolor);          }       }        imshow(dst, img);      waitkey(0);        //show support vectors      int sv_num= svm.get_support_vector_count();       for (int i= 0; i    {           const float* support = svm.get_support_vector(i);           circle(img, point((int) (support[0] * cols), (int) (support[1] * rows)), 5, cv_rgb(200, 200, 200));       }        imshow(dst, img);      waitkey(0);        return 0;  }    int main(int argc, char** argv)  {      return newsvmtest(400, 600, 100);  }   
学习样本:
分类:
支持向量:
其它类似信息

推荐信息