OpenCV机器学习SVM支持向量机的分类程序.docx
OpenCV机器学习SVM支持向量机的分类程序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 ptss; /定义1000个点 27. float datas*2; /点的坐标 28. int ress; /点的所属类 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. 37. / (2)学习数据的生成 38. for (i= 0; i< s; i+) 39. ptsi.x= cvRandInt(&rng) % size; /用随机整数赋值 40. ptsi.y= cvRandInt(&rng) % size; 41. if (ptsi.y> 50 * cos(ptsi.x* CV_PI/ 100) + 200) 42. cvLine(img, cvPoint(ptsi.x- 2, ptsi.y- 2), cvPoint(ptsi.x+ 2, ptsi.y+ 2), CV_RGB(255, 0, 0); 43. cvLine(img, cvPoint(ptsi.x+ 2, ptsi.y- 2), cvPoint(ptsi.x- 2, ptsi.y+ 2), CV_RGB(255, 0, 0); 44. resi = 1; 45. 46. else 47. if (ptsi.x> 200) 48. cvLine(img, cvPoint(ptsi.x- 2, ptsi.y- 2), cvPoint(ptsi.x+ 2, ptsi.y+ 2), CV_RGB(0, 255, 0); 49. cvLine(img, cvPoint(ptsi.x+ 2, ptsi.y- 2), cvPoint(ptsi.x- 2, ptsi.y+ 2), CV_RGB(0, 255, 0); 50. resi = 2; 51. 52. else 53. cvLine(img, cvPoint(ptsi.x- 2, ptsi.y- 2), cvPoint(ptsi.x+ 2, ptsi.y+ 2), CV_RGB(0, 0, 255); 54. cvLine(img, cvPoint(ptsi.x+ 2, ptsi.y- 2), cvPoint(ptsi.x- 2, ptsi.y+ 2), CV_RGB(0, 0, 255); 55. resi = 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. datai* 2 = float (ptsi.x) / size; 69. datai* 2 + 1 = float (ptsi.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. svm.train(&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 (resi) 120. case 1: 121. rcolor= CV_RGB(255, 0, 0); 122. break; 123. case 2: 124. rcolor= CV_RGB(0, 255, 0); 125. break; 126. case 3: 127. rcolor= CV_RGB(0, 0, 255); 128. break; 129. 130. cvLine(img, cvPoint(ptsi.x- 2, ptsi.y- 2), cvPoint(ptsi.x+ 2, ptsi.y+ 2), rcolor); 131. cvLine(img, cvPoint(ptsi.x+ 2, ptsi.y- 2), cvPoint(ptsi.x- 2, ptsi.y+ 2), rcolor); 132. 133. /将训练数据在结果图像上重复的绘制出来。 134. 135. / (8)支持向量的绘制 136. sv_num= svm.get_support_vector_count; 137. for (i= 0; i< sv_num; i+) 138. support = svm.get_support_vector(i); 139. cvCircle(img, cvPoint(int) (support0 * size), (int) (support1 * size), 5, CV_RGB(200, 200, 200); 140. 141. /用白色的圆圈对支持向量作标记。 142. 143. / (9)图像的显示 144. cvNamedWindow("SVM", CV_WINDOW_AUTOSIZE); 145. cvShowImage("SVM", img); 146. cvWaitKey(0); 147. cvDestroyWindow("SVM"); 148. cvReleaseImage(&img); 149. return 0; 150. /显示实际处理结果的图像,直到某个键被按下为止。 151.