1. //利用SVM解决2维空间向量的3级分类问题
2.
3. #include "stdafx.h"
4.
5. 产品诉求#include "cv.h"
6. #include "highgui.h"
7.
8. #include <ML.H>
9. #include <TIME.H>
10.
11. #include <CTYPE.H>
12.
13. #include <IOSTREAM>
14. using namespace std;
15.
16. int main(int argc, char **argv)
17. {
18. int size = 400; //图像的长度和宽度 19. const int s = 100; //试验点个数(可更改!!)
20. int i, j, sv_num;
21. IplImage *img;
22. CvSVM svm = CvSVM(); //★★★
23. CvSVMParams param;
24. CvTermCriteria criteria;//停止迭代的标准
25. CvRNG rng = cvRNG(time(NULL));
26. CvPoint pts[s]; //定义1000个点
27. float data[s*2]; //点的坐标
28. int res[s]; //点的所属类
29. 刘天华简介 CvMat data_mat, res_mat;
30. CvScalar rcolor;
31. const float *support;
32. // (1)图像区域的确保和初始化
33. img= cvCreateImage(cvSize(size, size), IPL_DEPTH_8U, 3);
34. cvZero(img); 石岛实验小学
35. //确保画像区域,并清0(用黑作初始化处理)。
36.
38. for (i= 0; i< s; i++) {
39. pts[i].x= cvRandInt(&rng) % size; //用随机整数赋值
40. pts[i].y= cvRandInt(&rng) % size;
41. if (pts[i].y> 50 * cos(pts[i].x* CV_PI/ 100) + 200) {
42. 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));
43. 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));
44. res[i] = 1;
45. }
46. else {
47. if (pts[i].x> 200) {
48. 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));
49. 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));
50. res[i] = 2;
51. }
52. else {
53. 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));
54. 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)); 注塑机螺杆的选择
55. res[i] = 3;
56. }
57. }
58. }
59. //生成2维随机训练数据,并将其值放在CvPoint数据类型的数组pts[ ]中。
60.
61. // (3)学习数据的显示
62. cvNamedWindow("SVM", CV_WINDOW_AUTOSIZE);
63. cvShowImage("SVM", img);
64. cvWaitKey(0);
65.
66. // (4)学习参数的生成
67. for (i= 0; i< s; i++) {
68. data[i* 2] = float (pts[i].x) / size;
69. data[i* 2 + 1] = float (pts[i].y) / size;
70. }
71. cvInitMatHeader(&data_mat, s, 2, CV_32FC1, data);
72. cvInitMatHeader(&res_mat, s, 1, CV_32SC1, res);
73. criteria= cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
74. param= CvSVMParams (CvSVM::C_SVC, CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL, criteria); 黎祥
75. /*
76. SVM种类:CvSVM::C_SVC
77. Kernel的种类:CvSVM::RBF
78. degree:10.0(此次不使用)
79. gamma:8.0
80. coef0:1.0(此次不使用)
81. C:10.0
82. nu:0.5(此次不使用)
83. p:0.1(此次不使用) 延胡索酸
84. 然后对训练数据正规化处理,并放在CvMat型的数组里。
85. */
86.
87.
88. //☆☆☆☆☆☆☆☆☆(5)SVM学习☆☆☆☆☆☆☆☆☆☆☆☆
89. ain(&data_mat, &res_mat, NULL, NULL, param);//☆
90. //☆☆利用训练数据和确定的学习参数,进行SVM学习☆☆☆☆
91.
92. // (6)学习结果的绘图
93. for (i= 0; i< size; i++) {
94. for (j= 0; j< size; j++) {
95. CvMat m;
96. float ret = 0.0;
97. float a[] = { float (j) / size, float (i) / size };
98. cvInitMatHeader(&m, 1, 2, CV_32FC1, a);
99. ret= svm.predict(&m);
100. switch ((int) ret) {
101. case 1:
102. rcolor= CV_RGB(100, 0, 0);
103. break;
104. case 2:
105. rcolor= CV_RGB(0, 100, 0);
106. break;
107. case 3:
108. rcolor= CV_RGB(0, 0, 100);
109. break;
110. }
111. cvSet2D(img, i, j, rcolor);
112. }
113. }
114. //为了显示学习结果,通过输入图像区域的所有像素(特征向量)并进行分类。然后对输入像素用所属等级的颜绘图。
115.
116. // (7)训练数据的再绘制
117. for (i= 0; i< s; i++) {
118. CvScalar rcolor;
119. switch (res[i]) {
120. case 1:
121. rcolor= CV_RGB(255, 0, 0);
122. break;
123. case 2: