opencv用SVM进行多类分类

        最近遇到一个多分类的问题,在网上查了些有关SVM的资料,这篇日志是来自:http://wenku.baidu.com/view/81c3e210f18583d0496459f0.html  自己写代码实现了下,感觉很好使,作为一个学习的例子,放在自己的博客里,供以后查阅使用。


    
    
  1. #include “stdafx.h”
  2. #include “cv.h”
  3. #include “highgui.h”
  4. #include “ml.h”
  5. #include <TIME.H>
  6. #include <CTYPE.H>
  7. #include <IOSTREAM>
  8. using namespace std;
  9. int main(int argc, char* argv[])
  10. {
  11. int size = 400; // height and widht of image
  12. const int s = 1000; // number of data
  13. int i, j,sv_num;
  14. IplImage* img;
  15. CvSVM svm = CvSVM();
  16. CvSVMParams param;
  17. CvTermCriteria criteria; // 停止迭代标准
  18. CvRNG rng = cvRNG(time( NULL));
  19. CvPoint pts[s]; // 定义1000个点
  20. float data[s* 2]; // 点的坐标
  21. int res[s]; // 点的类别
  22. CvMat data_mat, res_mat;
  23. CvScalar rcolor;
  24. const float* support;
  25. // 图像区域的初始化
  26. img = cvCreateImage(cvSize(size,size),IPL_DEPTH_8U, 3);
  27. cvZero(img);
  28. // 学习数据的生成
  29. for (i= 0; i<s;++i)
  30. {
  31. pts[i].x = cvRandInt(&rng)%size;
  32. pts[i].y = cvRandInt(&rng)%size;
  33. if (pts[i].y> 50* cos(pts[i].x*CV_PI/ 100)+ 200)
  34. {
  35. 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));
  36. 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));
  37. res[i]= 1;
  38. }
  39. else
  40. {
  41. if (pts[i].x> 200)
  42. {
  43. 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));
  44. 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));
  45. res[i]= 2;
  46. }
  47. else
  48. {
  49. 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));
  50. 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));
  51. res[i]= 3;
  52. }
  53. }
  54. }
  55. // 学习数据的现实
  56. cvNamedWindow( “SVM”,CV_WINDOW_AUTOSIZE);
  57. cvShowImage( “SVM”,img);
  58. cvWaitKey( 0);
  59. // 学习参数的生成
  60. for (i= 0;i<s;++i)
  61. {
  62. data[i* 2] = float(pts[i].x)/size;
  63. data[i* 2+ 1] = float(pts[i].y)/size;
  64. }
  65. cvInitMatHeader(&data_mat,s, 2,CV_32FC1,data);
  66. cvInitMatHeader(&res_mat,s, 1,CV_32SC1,res);
  67. criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000,FLT_EPSILON);
  68. param = CvSVMParams(CvSVM::C_SVC,CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL,criteria);
  69. // SVM type:CvSVM::C_SVC Kernel:CvSVM::RBF degree:10.0 gamma:8.0 coef0:1.0
  70. svm.train(&data_mat,&res_mat, NULL, NULL,param);
  71. // 学习结果绘图
  72. for (i= 0;i<size;i++)
  73. {
  74. for (j= 0;j<size;j++)
  75. {
  76. CvMat m;
  77. float ret = 0.0;
  78. float a[] = { float(j)/size, float(i)/size};
  79. cvInitMatHeader(&m, 1, 2,CV_32FC1,a);
  80. ret = svm.predict(&m);
  81. switch(( int)ret)
  82. {
  83. case 1:
  84. rcolor = CV_RGB( 100, 0, 0);
  85. break;
  86. case 2:
  87. rcolor = CV_RGB( 0, 100, 0);
  88. break;
  89. case 3:
  90. rcolor = CV_RGB( 0, 0, 100);
  91. break;
  92. }
  93. cvSet2D(img,i,j,rcolor);
  94. }
  95. }
  96. // 为了显示学习结果,通过对输入图像区域的所有像素(特征向量)进行分类,然后对输入的像素用所属颜色等级的颜色绘图
  97. for(i= 0;i<s;++i)
  98. {
  99. CvScalar rcolor;
  100. switch(res[i])
  101. {
  102. case 1:
  103. rcolor = CV_RGB( 255, 0, 0);
  104. break;
  105. case 2:
  106. rcolor = CV_RGB( 0, 255, 0);
  107. break;
  108. case 3:
  109. rcolor = CV_RGB( 0, 0, 255);
  110. break;
  111. }
  112. cvLine(img,cvPoint(pts[i].x -2,pts[i].y -2),cvPoint(pts[i].x+ 2,pts[i].y+ 2),rcolor);
  113. cvLine(img,cvPoint(pts[i].x+ 2,pts[i].y -2),cvPoint(pts[i].x -2,pts[i].y+ 2),rcolor);
  114. }
  115. // 支持向量的绘制
  116. sv_num = svm.get_support_vector_count();
  117. for (i= 0; i<sv_num;++i)
  118. {
  119. support = svm.get_support_vector(i);
  120. cvCircle(img,cvPoint(( int)(support[ 0]*size),( int)(support[i]*size)), 5,CV_RGB( 200, 200, 200));
  121. }
  122. cvNamedWindow( “SVM”,CV_WINDOW_AUTOSIZE);
  123. cvShowImage( “SVM”,img);
  124. cvWaitKey( 0);
  125. cvDestroyWindow( “SVM”);
  126. cvReleaseImage(&img);
  127. return 0;
  128. }


        </div>
            </div>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值