talk is cheap, show you the code:

/************************************************************************/
/* Name   : OpenCV SVM test                                             */
/* Date   : 2015/11/7                                                   */
/* Author : aban                                                        */
/************************************************************************/
// note : the code is modified from internet. 

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

#include <opencv2/opencv.hpp>
#include <opencv2/ml.hpp>
using namespace cv;

bool plotSupportVectors = true;
int numTrainingPoints = 200;
int numTestPoints = 2000;
int size = 200;
int eq = 0;

// accuracy
float evaluate(cv::Mat& predicted, cv::Mat& actual) {
  assert(predicted.rows == actual.rows);
  int t = 0;
  int f = 0;
  for (int i = 0; i < actual.rows; i++) {
    float p = predicted.at<float>(i, 0);
    float a = actual.at<float>(i, 0);
    if ((p >= 0.0 && a >= 0.0) || (p <= 0.0 &&  a <= 0.0)) {
      t++;
    }
    else {
      f++;
    }
  }
  return (t * 1.0) / (t + f);
}

// plot data and class
void plot_binary(cv::Mat& data, cv::Mat& classes, string name) {
  cv::Mat plot(size, size, CV_8UC3);
  plot.setTo(cv::Scalar(255.0, 255.0, 255.0));
  for (int i = 0; i < data.rows; i++) {

    float x = data.at<float>(i, 0) * size;
    float y = data.at<float>(i, 1) * size;

    if (classes.at<float>(i, 0) > 0) {
      cv::circle(plot, Point(x, y), 2, CV_RGB(255, 0, 0), 1);
    }
    else {
      cv::circle(plot, Point(x, y), 2, CV_RGB(0, 255, 0), 1);
    }
  }
  cv::namedWindow(name, CV_WINDOW_KEEPRATIO);
  cv::imshow(name, plot);
}

// function to learn
int f(float x, float y, int equation) {
  switch (equation) {
  case 0:
    return y > sin(x * 10) ? -1 : 1;
    break;
  case 1:
    return y > cos(x * 10) ? -1 : 1;
    break;
  case 2:
    return y > 2 * x ? -1 : 1;
    break;
  case 3:
    return y > tan(x * 10) ? -1 : 1;
    break;
  default:
    return y > cos(x * 10) ? -1 : 1;
  }
}

// label data with equation
cv::Mat labelData(cv::Mat points, int equation) {
  cv::Mat labels(points.rows, 1, CV_32FC1);
  for (int i = 0; i < points.rows; i++) {
    float x = points.at<float>(i, 0);
    float y = points.at<float>(i, 1);
    labels.at<float>(i, 0) = f(x, y, equation);
  }
  return labels;
}

void svm(cv::Mat& trainingData, cv::Mat& trainingClasses, cv::Mat& testData, cv::Mat& testClasses) {

  Mat traning_label(trainingClasses.rows, 1, CV_32SC1);
  for (int i = 0; i < trainingClasses.rows; i++){
    traning_label.at<int>(i, 0) = trainingClasses.at<float>(i, 0);
  }

  cv::Ptr<cv::ml::SVM> svm = ml::SVM::create();
  svm->setType(ml::SVM::Types::C_SVC);
  svm->setKernel(ml::SVM::KernelTypes::RBF);
  //svm->setDegree(0);  // for poly
  svm->setGamma(20);  // for poly/rbf/sigmoid
  //svm->setCoef0(0);   // for poly/sigmoid
  svm->setC(7);       // for CV_SVM_C_SVC, CV_SVM_EPS_SVR and CV_SVM_NU_SVR
  //svm->setNu(0);      // for CV_SVM_NU_SVC, CV_SVM_ONE_CLASS, and CV_SVM_NU_SVR
  //svm->setP(0);       // for CV_SVM_EPS_SVR

  svm->setTermCriteria(TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 1000, 1E-6));

  svm->train(trainingData, ml::SampleTypes::ROW_SAMPLE, traning_label);

  cv::Mat predicted(testClasses.rows, 1, CV_32F);

  svm->predict(testData, predicted);

  cout << "Accuracy_{SVM} = " << evaluate(predicted, testClasses) << endl;
  plot_binary(testData, predicted, "Predictions SVM");

  // plot support vectors
  if (plotSupportVectors) {
    cv::Mat plot_sv(size, size, CV_8UC3);
    plot_sv.setTo(cv::Scalar(255.0, 255.0, 255.0));

    Mat support_vectors = svm->getSupportVectors();
    for (int vecNum = 0; vecNum < support_vectors.rows; vecNum++){
      cv::circle(plot_sv, Point(support_vectors.row(vecNum).at<float>(0)*size, support_vectors.row(vecNum).at<float>(1)*size), 3, CV_RGB(0, 0, 0));
    }

    namedWindow("Support Vectors", CV_WINDOW_KEEPRATIO);
    cv::imshow("Support Vectors", plot_sv);
  }
}

int main(){

  cv::Mat trainingData(numTrainingPoints, 2, CV_32FC1);
  cv::Mat testData(numTestPoints, 2, CV_32FC1);

  cv::randu(trainingData, 0, 1);
  cv::randu(testData, 0, 1);

  cv::Mat trainingClasses = labelData(trainingData, eq);
  cv::Mat testClasses = labelData(testData, eq);

  plot_binary(trainingData, trainingClasses, "Training Data");
  plot_binary(testData, testClasses, "Test Data");

  svm(trainingData, trainingClasses, testData, testClasses);
  waitKey(0);
  return 0;
}

[code segments] OpenCV3.0 SVM with C++ interface的更多相关文章

  1. 【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

    前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...

  2. Atitit opencv3.0  3.1 3.2 新特性attilax总结

    Atitit opencv3.0  3.1 3.2 新特性attilax总结 1. 3.0OpenCV 3 的改动在哪?1 1.1. 模块构成该看哪些模块?2 2. 3.1新特性 2015-12-21 ...

  3. ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录

    已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...

  4. VS2013 Community配置OpenCV3.0.0

    配置环境:32位win7系统+VS2013 Community版本 1.首先从OpenCV官网上下载最新版本的OpenCV for Windows. 2.直接双击打开下载得到的opencv-3.0.0 ...

  5. opencv3.0 在 android 上的使用

    下载 OpenCV-3.0.0-android-sdk-1.zip 打开 intellj,新建立一个 android 工程后选择工程属性,导入模块(Import module from externa ...

  6. Caffe搭建:Ubuntu14.04 + CUDA7.0 + opencv3.0 + Matlab2014A

    从Hinton在science上发表深度学习训练开创新的文章以来,深度学习火了整整有3年多,而且随着新的硬件和算法的提出,深度学习正在应用于越来越多的领域,发挥其算法的优势. 实验室并没有赶上第一波深 ...

  7. opencv3.0中contrib模块的添加+实现SIFT/SURF算法

    平台:win10 x64 +VS 2015专业版 +opencv-3.x.+CMake+Anaconda3(python3.7.0) Issue说明:Opencv3.0版本已经发布了有一段时间,在这段 ...

  8. Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]

    更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...

  9. OpenCV3 Ref SVM : cv::ml::SVM Class Reference

    OpenCV3  Ref SVM : cv::ml::SVM Class Reference OpenCV2: #include <opencv2/core/core.hpp>#inclu ...

随机推荐

  1. [HNOI 2005]狡猾的商人

    Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 ...

  2. [HNOI2016]大数

    题目描述 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个询问求 S 的 ...

  3. 【LSGDOJ1836】: 量化交易 贪心

    题目描述 applepi 训练了一个可以自动在股票市场进行量化交易的模型.通常来说,applepi 写出的模型,你懂得,就好比一架印钞机.不过为了谨慎起见,applepi还是想先检查一下模型的效果.a ...

  4. [JLOI2015]城池攻占 左偏树

    题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...

  5. ●BZOJ 2588 Spoj 10628. Count on a tree

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2588 题解: 主席树,在线,(求LCA)感觉主席树真的好厉害...在原树上建主席树.即对于原 ...

  6. hdu5652 India and China Origins(并查集)

    India and China Origins  Accepts: 49  Submissions: 426  Time Limit: 2000/2000 MS (Java/Others)  Memo ...

  7. 某些情况下调用函数为什么要在函数名前加“(void)”

    我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...

  8. c++中双冒号的作用

    双冒号(::)用法 参考链接:https://segmentfault.com/a/1190000000345680 1.表示“域操作符”例:声明了一个类A,类A里声明了一个成员函数void f(), ...

  9. 初体验GCP,【福利300$试用金】

    1.https://cloud.google.com/free/ ,填写相应信息.需要信用卡,预扣1美元. 2.一波信息填写,成功. 3.激活终端 4.创建一个Python项目,选择部署地点. 5.部 ...

  10. CSS之绝对定位

    w3school定义: 绝对定位的元素的位置相对于最近的已定位祖先元素(这里的已定位指的是绝对定位或者相对定位),如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块. 对于定位的主要问题是要 ...