转:http://blog.csdn.net/yang_xian521/article/details/6969904

总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西。OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图像处理的初级阶段,我也得加油,深入研究它的算法库。就从ml入手吧,最近做东西遇到随机森林,被搞的头大,深深感觉自己肚子里货太少,关键时刻调不出东西来。切勿浮躁,一点点研究吧。

这次就先介绍一下机器学习中的一个常用算法SVM算法,即支持向量机Support Vector Machine(SVM),是一种有监督学习方法,更多介绍请见维基百科http://zh.wikipedia.org/wiki/SVM。

OpenCV开发SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(Lin Chih-Jen)等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。用OpenCV使用SVM算法的大概流程是

1)设置训练样本集

需要两组数据,一组是数据的类别,一组是数据的向量信息。

2)设置SVM参数

利用CvSVMParams类实现类内的成员变量svm_type表示SVM类型:

CvSVM::C_SVC  C-SVC

CvSVM::NU_SVC v-SVC

CvSVM::ONE_CLASS 一类SVM

CvSVM::EPS_SVR e-SVR

CvSVM::NU_SVR v-SVR

成员变量kernel_type表示核函数的类型:

CvSVM::LINEAR 线性:u‘v

CvSVM::POLY 多项式:(r*u'v + coef0)^degree

CvSVM::RBF RBF函数:exp(-r|u-v|^2)

CvSVM::SIGMOID sigmoid函数:tanh(r*u'v + coef0)

成员变量degree针对多项式核函数degree的设置,gamma针对多项式/rbf/sigmoid核函数的设置,coef0针对多项式/sigmoid核函数的设置,Cvalue为损失函数,在C-SVC、e-SVR、v-SVR中有效,nu设置v-SVC、一类SVM和v-SVR参数,p为设置e-SVR中损失函数的值,class_weightsC_SVC的权重,term_crit为SVM训练过程的终止条件。其中默认值degree = 0,gamma = 1,coef0 = 0,Cvalue = 1,nu = 0,p = 0,class_weights = 0

3)训练SVM

调用CvSVM::train函数建立SVM模型,第一个参数为训练数据,第二个参数为分类结果,最后一个参数即CvSVMParams

4)用这个SVM进行分类

调用函数CvSVM::predict实现分类

5)获得支持向量

除了分类,也可以得到SVM的支持向量,调用函数CvSVM::get_support_vector_count获得支持向量的个数,CvSVM::get_support_vector获得对应的索引编号的支持向量。

实现代码如下:

[cpp] view plaincopy
  1. // step 1:
  2. float labels[4] = {1.0, -1.0, -1.0, -1.0};
  3. Mat labelsMat(3, 1, CV_32FC1, labels);
  4. float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
  5. Mat trainingDataMat(3, 2, CV_32FC1, trainingData);
  6. // step 2:
  7. CvSVMParams params;
  8. params.svm_type = CvSVM::C_SVC;
  9. params.kernel_type = CvSVM::LINEAR;
  10. params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
  11. // step 3:
  12. CvSVM SVM;
  13. SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
  14. // step 4:
  15. Vec3b green(0, 255, 0), blue(255, 0, 0);
  16. for (int i=0; i<image.rows; i++)
  17. {
  18. for (int j=0; j<image.cols; j++)
  19. {
  20. Mat sampleMat = (Mat_<float>(1,2) << i,j);
  21. float response = SVM.predict(sampleMat);
  22. if (fabs(response-1.0) < 0.0001)
  23. {
  24. image.at<Vec3b>(j, i) = green;
  25. }
  26. else if (fabs(response+1.0) < 0.001)
  27. {
  28. image.at<Vec3b>(j, i) = blue;
  29. }
  30. }
  31. }
  32. // step 5:
  33. int c = SVM.get_support_vector_count();
  34. for (int i=0; i<c; i++)
  35. {
  36. const float* v = SVM.get_support_vector(i);
  37. }

OpenCV学习笔记(二十六)——小试SVM算法ml相关推荐

  1. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  2. OpenCV学习笔记(十六):直方图均衡化:equalizeHist()

    OpenCV学习笔记(十六):直方图均匀化:equalizeHist() 参考博客: 直方图均衡化的数学原理 直方图匹配的数学原理 直方图均衡化广泛应用于图像增强中: 直方图均衡化处理的"中 ...

  3. JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇

    二十六.JVM监控及诊断工具-GUI篇 1.工具概述 使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限: (1)无法获取方法级别的分析数据,如方法间的调用关系 ...

  4. Jenkins 持续集成 概念(学习笔记二十六)

    持续集成:提交.测试.构建.测试.部署 前不久接触了持续集成(Continuous Integration,CI). 一.持续集成是什么 首先说说"集成"的概念.在实际的软件开发中 ...

  5. 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程

    可以通过以下办法找到教程: 1,在软件界面点帮助-使用教程 2,在网站首页-帮助-教程进入 如何使用教程: 这里是一级目录,其实对新手最有用的是前面3个部分,后面的仿真先不看. 常见问题里面不光是讲的 ...

  6. opencv学习笔记二十九:SIFT特征点检测与匹配

    SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points) ...

  7. [傅里叶变换及其应用学习笔记] 二十六. 高维傅里叶变换的推导

    高维意味着函数中有多个变量,典型的高维傅里叶应用为图像处理. 一个二维图像的亮度(灰度)可以用$f(x_1,x_2)$来表示,以lena为例,图像平面作为$x_1,x_2$平面,灰度作为$z$轴,形成 ...

  8. opencv学习笔记三十六:AKAZE特征点检测与匹配

    KAZE是日语音译过来的 , KAZE与SIFT.SURF最大的区别在于构造尺度空间,KAZE是利用非线性方式构造,得到的关键点也就更准确(尺度不变性 ): Hessian矩阵特征点检测 ,方向指定, ...

  9. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  10. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

最新文章

  1. 电子科技大学计算机学院保研夏令营,电子科技大学计算机科学与工程学院网络空间安全保研夏令营...
  2. 百度超级链XChain(3)平台特点
  3. 化工原理 蒸馏(下)
  4. QML基础类型之double
  5. 操作篇 ARP协议欺诈
  6. jzoj3508-好元素【hash,优雅的暴力】
  7. 数据挖掘算法(logistic回归,随机森林,GBDT和xgboost)-腾讯云社区
  8. 关于(int argc char **argv)
  9. 第五章节 类的继承(访问修饰符)
  10. 零基础自学用Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha...
  11. OCP考点实战演练02-日常维护篇
  12. (转)汉字转拼音码缩写
  13. 7.3.Zeng_Cache(4) --- 后端
  14. 自己制作的ORMap框架终于完成的差不多了。
  15. 5G~ SON和MDT
  16. Ubuntu 安装 wine 和 TIM
  17. c语言怎么写注释,C语言如何注释一段代码?
  18. 2016腾讯实习生招聘在线笔试总结(移动开发)
  19. python 剔除nan_Pandas的数据清洗-删除NaN数据
  20. c语言火柴棒编辑,【NOIP2008】火柴棒等式

热门文章

  1. 【ROR】基础0-在vagrant中配置ror环境
  2. [翻译] SSKeychain
  3. [LeetCode] Rotate Array
  4. 利用PHP的VLD查询OPCODE
  5. 二、套接字类型与协议设置
  6. vim编辑器使用详解
  7. jdk unsafe类源码解析
  8. Java-IO操作性能对比
  9. 无法使用SQL login去登陆SQL Server - 'Password did not match'
  10. 数学分析原理 定理 6.8