OpenCV中SVM的使用

转自: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

4、 http://blog.csdn.net/carson2005/article/details/6547250

5、 http://www.opencv.org.cn/index.php?oldid=8202&printable=yes&title=%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值