下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、我的 OpenCV 学习笔记(六) :使用支持向量机( SVM )SVM 是 2000 年左右提出的一种新的分类方法, 着重解 决了小样本分类问题。具体原理可以参看模式识别的书籍。 OpenCV 中的 SVM 的实现也是基于大名鼎鼎的 SVM 库:cjlin。OpenCV 教程中有两个例子,一个是线性可分的,一个是线性不可分的,我对他 们做了详尽的注释: 先看线性可分时:cpp view plaincopy#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp&g
2、t; #include<opencv2/ml/ml.hpp>using namespace cv;int main() / Data for visual representationint width = 512, height = 512;Mat image =Mat:zeros(height, width, CV_8UC3);/ Set uptraining datafloat labels5 = 1.0, -1.0, -1.0, -1.0,1.0;Mat labelsMat(5, 1, CV_32FC1, labels);floattrainingData5
3、2 = 501, 10, 255, 10, 501, 255, 10, 501,501,128 ;Mat trainingDataMat(5, 2,CV_32FC1, trainingData);/设置支持向量机的参数CvSVMParams params;params.svm_type= CvSVM:C_SVC;/SVM 类型:使用 C 支持向量机params.kernel_type = CvSVM:LINEAR;/ 核函数类型: 线性 params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);/ 终止准 则函数:当迭代次数达
4、到最大值时终止 / 训练 SVM /建立一个 SVM 类的实例 CvSVM SVM;/训练模型,参数为:输入数据、响应、XX、XX、参数(前面设置过) SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);Vec3b green(0,255,0), blue(255,0,0); /显示判决域for (int i = 0; i <image.rows; +i)for (int j = 0; j < image.cols;+j) Mat sampleMat = (Mat_<float&
5、;gt;(1,2) << i,j);/predict 是用来预测的,参数为:样本、返回值类型(如果 值为 ture 而且是一个 2 类问题则返回判决函数值, 否则返回 类标签)、 float response =SVM.predict(sampleMat); if (response = 1) image.at<Vec3b>(j, i) = green; else if (response = -1) image.at<Vec3b>(j, i) = blue; / 画出训练数据int thickness = -
6、1;int lineType =8; circle( image, Point(501, 10), 5, Scalar( 0, 0, 0), thickness, lineType);/ 画圆 circle( image, Point(255, 10), 5, Scalar(255, 255, 255), thickness,lineType);circle( image, Point(501, 255), 5,Scalar(255, 255, 255), thickness, lineType); circle( image, Point( 10, 501), 5, Scalar(255,
7、255, 255), thickness, lineType); circle(image, Point( 501, 128), 5, Scalar(0, 0, 0), thickness, lineType);/ 显示支持向量 thickness = 2; lineType = 8;/ 获取支持向量的个数 int c = SVM.get_support_vector_count();for (int i = 0; i <c; +i) / 获取第 i 个支持向量const float* v = SVM.get_support_vector(i);/ 支持向量用到的样本点,用灰色进
8、行标注 circle( image, Point( (int) v0, (int) v1),6,Scalar(128, 128, 128), thickness, lineType); imwrite("result.png", image);/ save the imageimshow("SVM Simple Example", image); / show it to the user waitKey(0); 线性不可分时由于样本较多,训练的时间比较长: cpp view plaincopy#include <iostream&
9、gt; #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #includeusing<opencv2/ml/ml.hpp> #include "time.h"namespace cv; using namespace std;/ 程序说明: /一共两个样本集每个样本集有 100 个样本,其中 90 个是线 性可分的, 10 个线型不可分 / 这 200 个样本数据储存在 trainData 内: t
10、rainData 是一个 200 行 2 列的矩阵,其中第 一列储存样本的 X 值,第二列储存的是样本的 Y 值 /每一 列的前 90 个元素是第一类的线性可分部分, 后 90 个元素是 第二类的线性可分部分,中间的 20 个元素是线性不可分部 分 / 第一类样本的 X 值分布在整幅图像的 0,0.4 范围内, 第二类样本的 X 值分布在整幅图像的 0.6,1 范围内,中间的 0.4,0.6 是线性不可分的部分;这三部分的 Y 值都在整幅图 像的高度内自由分布/每个样本集的数量#defineNTRAINING_SAMPLES 100/其中的线性部分#define FRAC_LINEAR_SEP
11、0.9f int main()/定义显示结果的图像/ 图像的宽度、高度const int WIDTH = 512,HEIGHT = 512;Mat image =Mat:zeros(HEIGHT,WIDTH,CV_8UC3);*/* 第一步:设定训练数据1.设定数据结构*/承载训练数据的结构 Mat trainData(2*NTRAINING_SAMPLES,2,CV_32FC1);/承载这些数据分类的结构Matlabels(2*NTRAINING_SAMPLES,1,CV_32FC1);/设定随机数种子部分的数据量RNG rng(100);/设定线性可分int nLinearSamples
12、= (int)*2.设定第一类中的数据*/从整个(NTRAINING_SAMPLES*FRAC_LINEAR_SEP);数据集中取出前 0,89 行/注: *Range 的范围是 a,b)Mat trainClass = trainData.rowRange(0,nLinearSamples); /取出第一列Mat c = trainClass.colRange(0,1);/随机生成 X 的值: 0,0.4*WIDTH rng.fill(c,RNG:UNIFORM,Scalar(1),Scalar(0.4*WIDTH);/取出第二列c = trainClass.colRange(1,2); /
13、随机生成 Y 的值rng.fill(c,RNG:UNIFORM,Scalar(1),Scalar(HEIGHT);*2.设定第二类的数据*/从整个数据中取出 110,199 行 trainClass =trainData.rowRange(2*NTRAINING_SAMPLES-nLinearSa mples,2*NTRAINING_SAMPLES);/ 取出第一列c = trainClass.colRange(0,1);/ 随机生成 X 的值0.6*WIDTH,WIDTHrng.fill(c,RNG:UNIFORM,Scalar(0.6*WIDTH),Scalar(WIDTH);/取出第二列
14、/ 随机生成 Y 的值trainClass.colRange(1,2);rng.fill(c,RNG:UNIFORM,Scalar(1),Scalar(HEIGHT);*3. 设定线性不可分的数据*/取出 90,109 行 trainClass = trainData.rowRange(nLinearSamples,2*NTRAINING_SAMPLES-nLinearSamples); /取出第一列 c = trainClass.colRange(0,1); / 随机生成 X 的值0.4*WIDTH,0.6*WIDTH rng.fill(c,RNG:UNIFORM,Scalar(0.4*WI
15、DTH),Scalar(0.6*WIDTH);/取出第二列c =trainClass.colRange(1,2); / 随机生成 Y 的值rng.fill(c,RNG:UNIFORM,Scalar(1),Scalar(HEIGHT);/*4. 为所有数据设置标签*/前100 个数据设为第一类labels.rowRange(0,NTRAINING_SAMPLES).setTo(1);/后 100 个数据设为第二类labels.rowRange(NTRAINING_SAMPLES,2*NTRAINING_ SAMPLES).setTo(2); /* 第二步:设置 SVM 参数 * CvSVMPar
16、ams params;/终止准则:/SVM 类型: C-Support Vector Classification params.svm_type = SVM:C_SVC; params.C = 0.1;/ 和函数类型: Linear kernel params.kernel_type = SVM:LINEAR;当迭代次数到达最大值后终止 params.term_crit = TermCriteria(CV_TERMCRIT_ITER,(int) 1e7,1e-6);/开始计时/* 第三步:训练 SVM *cout<<" 开始训练过程 "&
17、;lt;<endl;clock_t start,finish;double duration;start =clock();/*1. 建立一个 SVM实例 *CvSVM svm;/*2. 调用训练函数*svm.train(trainData,labels,Mat(),Mat(),params);/ 结束计时 finish = clock();duration =(double)(finish-start) / CLOCKS_PER_SEC;cout<<" 训练过程结束 ,共耗时: "<<duration&
18、amp;lt;<" 秒 "<<endl; /* 第四步:显示判 决域 */第一类用绿色;第二类用蓝色Vec3b green(0,100,0),blue(100,0,0);for(int i = 0; i <image.rows; +i) for(int j = 0; j <image.cols; +j) Mat sampleMat = (Mat_<float>(1,2)<<i,j);float response = svm.predict(sampl
19、eMat); if (response = 1) image.at<Vec3b>(j,i) =green; else if (response =2)image.at<Vec3b>(j,i) =blue; /* 第五步:显示训练数据*/红色/负数会导致画出的图型是实心的int thick = -1;int lineType = 8;类 *float px,py;for(int i = 0; i <1. 第一px =NTRAINING_SAMPLES; +i) trainData.at<float>(i,0); py = trainData.at<float>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025 年大学勘查技术与工程(地球物理勘探)期末测试卷
- 骨科护理中的护理管理新理念
- 安徽省合肥市一六八中学2026届高三3月份规范训练 语文试卷(含答案详解)
- 2024-2025学年度保安员考试经典例题及完整答案详解(必刷)
- 2024-2025学年度河北政法职业学院单招《数学》每日一练试卷及完整答案详解
- 2024-2025学年度电工能力提升B卷题库(夺冠)附答案详解
- 2024-2025学年反射疗法师大赛理论模拟试题(轻巧夺冠)附答案详解
- 2024-2025学年度中医助理医师考前冲刺试卷及参考答案详解(考试直接用)
- 2024-2025学年度钦州幼儿师范高等专科学校单招《职业适应性测试》模考模拟试题及参考答案详解【基础题】
- 2024-2025学年度执业兽医模拟题库及完整答案详解(夺冠)
- 2025年皖北卫生职业学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 《经络与腧穴》课件-手少阴心经
- 金矿融资计划书范文
- 法规解读丨2024新版《突发事件应对法》及其应用案例
- 汽车机械基础课件:第七单元汽车液压传动课件
- 齐鲁工业大学《思想道德与法治》2021-2022学年第一学期期末试卷
- 桥梁设计方案构思方法
- 系统解剖学(南方医科大学)智慧树知到期末考试答案2024年
- Unit2Yummy!(课件)新概念英语青少版StarterA
- 康复心理学-第一章-绪论课件
- T-CSEM 0024-2024 智慧消防 火灾防控系统建设要求
评论
0/150
提交评论