⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svm opencv.txt

📁 opecv中支持向量机的编程示例 包括了二维和多维的特征分类的方法
💻 TXT
📖 第 1 页 / 共 2 页
字号:
サポートベクターマシン
作成者: 怡土順一, 最終変更者: 怡土順一, 最終変更リビジョン: 357, 最終変更日時: 2007-12-26 14:22:07 +0900 (水, 26 12月 2007)
■ サポートベクターマシン
OpenCV-1.0.0で提供されるSVMに関する関数は,libsvmライブラリ(version 2.6)の機能を実装したものである.また,このバージョンでは,学習後のパラメータを保存,読み込みする関数(save, load)にバグが存在し,Yahoo!Groupsで報告されているパッチ(http://tech.groups.yahoo.com/group/OpenCV/message/48635 )等をあてなければ,当該機能が利用できないので注意すること. 
サンプル

--------------------------------------------------------------------------------

サポートベクターマシン CvSVM
SVMを利用して2次元ベクトルの3クラス分類問題を解く

サンプルコード
 

#include <cv.h>
#include <highgui.h>
#include <ml.h>
#include <time.h>

int
main (int argc, char **argv)
{
  const int s = 1000;
  int size = 400;
  int i, j, sv_num;
  IplImage *img;
  CvSVM svm = CvSVM ();
  CvSVMParams param;
  CvTermCriteria criteria;
  CvRNG rng = cvRNG (time (NULL));
  CvPoint pts[s];
  float data[s * 2];
  int res[s];
  CvMat data_mat, res_mat;
  CvScalar rcolor;
  const float *support;

  // (1)画像領域の確保と初期化
  img = cvCreateImage (cvSize (size, size), IPL_DEPTH_8U, 3);
  cvZero (img);

  // (2)学習データの生成
  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;
      }
    }
  }

  // (3)学習データの表示
  cvNamedWindow ("SVM", CV_WINDOW_AUTOSIZE);
  cvShowImage ("SVM", img);
  cvWaitKey (0);

  // (4)学習パラメータの生成
  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);

  // (5)SVMの学習
  svm.train (&data_mat, &res_mat, NULL, NULL, param);

  // (6)学習結果の描画
  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);
    }
  }

  // (7)トレーニングデータの再描画
  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);
  }

  // (8)サポートベクターの描画
  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));
  }

  // (9)画像の表示
  cvNamedWindow ("SVM", CV_WINDOW_AUTOSIZE);
  cvShowImage ("SVM", img);
  cvWaitKey (0);

  cvDestroyWindow ("SVM");
  cvReleaseImage (&img);

  return 0;
}


// (1)画像領域の確保と初期化
画像領域を確保し,ゼロクリア(黒色で初期化)する. 

// (2)トレーニングデータの生成
2次元のトレーニングデータをランダムに生成し,その値をCvPoint型の配列pts[]に格納する.また,各トレーニングデータのクラスを閾値によって決定し,配列res[]に格納する. 

// (3)トレーニングデータの表示
生成されたトレーニングデータを,最初に確保した画像上に描画し,表示する.クラス1-3までが,赤,緑,青の各色で示される.ここで,何かキーが押されるまで待つ. 

// (4)学習パラメータの生成
SVMの学習パラメータを以下のように決定する. 

svmの種類:CvSVM::C_SVC
カーネルの種類:CvSVM::RBF
degree:10.0(今回は,利用されない)
gamma:8.0
coef0:1.0(今回は,利用されない)
C:10.0
nu:0.5(今回は,利用されない)
p:0.1(今回は,利用されない)

また,トレーニングデータを正規化し,CvMat型の行列に格納する. 

// (5)SVMの学習
トレーニングデータと決められた学習パラメータを用いて,SVMの学習をおこなう. 

// (6)学習結果の描画
学習結果を示すために,画像領域内の全てのピクセル(特徴ベクトル)を入力として,クラス分類を行う.また,入力ピクセルを,それが属するクラスに対応した色で描画する. 

// (7)トレーニングデータの再描画
トレーニングデータを,結果画像の上に重ねて描画する. 

// (8)サポートベクターの描画
トレーニングデータのうち,サポートベクターを白い丸で囲んで表示する. 

// (9)画像の表示
実際に,処理結果の画像を表示し,何かキーが押されると終了する. 

実行結果例
[左]学習サンプル,[右]分類結果 
  


--------------------------------------------------------------------------------

画像の各ピクセル値を特徴ベクトルとしたSVMの学習
学習用の画像を読み込み,そのピクセル値を特徴ベクトルとしてSVMの学習を行う

サンプルコード
 

#include <cv.h>
#include <highgui.h>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -