1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #include <cv.h>
#include <highgui.h>
#include <ml.h>
#include <time.h>
int
main (int argc, char **argv)
{
const int s = 1000;
int size = 400;
int i, j, sv_num;
IplImage *img;
CvSVM svm = CvSVM ();
CvSVMParams param;
CvTermCriteria criteria;
CvRNG rng = cvRNG (time (NULL));
CvPoint pts[s];
float data[s * 2];
int res[s];
CvMat data_mat, res_mat;
CvScalar rcolor;
const float *support;
img = cvCreateImage (cvSize (size, size), IPL_DEPTH_8U, 3);
cvZero (img);
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 (img, cvPoint (pts[i].x - 2, pts[i].y - 2), cvPoint (pts[i].x + 2, pts[i].y + 2), CV_RGB (255, 0, 0));
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));
res[i] = 1;
}
else {
if (pts[i].x > 200) {
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));
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));
res[i] = 2;
}
else {
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));
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));
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, NULL, criteria);
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_32FC1, a);
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 (img, i, j, rcolor);
}
}
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 (img, cvPoint (pts[i].x - 2, pts[i].y - 2), cvPoint (pts[i].x + 2, pts[i].y + 2), rcolor);
cvLine (img, cvPoint (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 (img, cvPoint ((int) (support[0] * size), (int) (support[1] * size)), 5, CV_RGB (200, 200, 200));
}
cvNamedWindow ("SVM", CV_WINDOW_AUTOSIZE);
cvShowImage ("SVM", img);
cvWaitKey (0);
cvDestroyWindow ("SVM");
cvReleaseImage (&img);
return 0;
} |
Partager