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
總結
以上是生活随笔為你收集整理的OpenCV中SVM的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV提取轮廓(去掉面积小的轮廓)
- 下一篇: Windows7 libsvm库中gri