转自:http://download.csdn.net/download/gaogaogao124/3125857
略有改动:
#include"stdafx.h"
#include<opencv2/opencv.hpp>
#include<cmath>
#include<ctime>
using namespace std;
int _tmain(int argc,_TCHAR*argv[])
{
intsize = 400;//图像的长度和宽度
constints = 1000;//试验点个数
inti,j, sv_num;
IplImage *img;
CvSVMsvm =CvSVM();//构造一个SVM类对象
CvSVMParamsparam;//SVM参数
CvTermCriteriacriteria;//迭代算法的结束条件
CvRNGrng =cvRNG(time(NULL));//随机数typedef uint64 CvRNG;
CvPointpts[s];
floatdata[s*2];
intres[s];
CvMatdata_mat,res_mat;
CvScalarrcolor;
constfloat *support;
img =cvCreateImage(cvSize(size,size),IPL_DEPTH_8U, 3);
cvSetZero(img);
//训练数据的生成,并将其值存放在pts中
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学习
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);
}
}
cvNamedWindow("SVM1",CV_WINDOW_AUTOSIZE);
cvShowImage("SVM1",img);
cvWaitKey(0);
//训练数据绘制
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("SVM2",CV_WINDOW_AUTOSIZE);
cvShowImage("SVM2",img);
cvWaitKey(0);
cvDestroyWindow("SVM");
cvDestroyWindow("SVM1");
cvDestroyWindow("SVM2");
cvReleaseImage(&img);
return 0;
}
参考文献:
1、 http://blog.csdn.net/firefight/article/details/6400060
2、 http://blog.sina.com.cn/s/blog_4298002e010144k8.html
3、 http://hi.baidu.com/pengjun/blog/item/215e50da73e6cdd2b6fd48b6.html