[转载]用opencv实现svm

http://www.opencv.jp/sample/svm.html摘抄下来svm在opencv中的实现代码,本人太菜,用来学习~~
#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 [ *   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   ( =   0 ;  i  <  s ;  i ++)   {
    pts
[ i ]. =  cvRandInt  (& rng )   %  size ;
    pts
[ i ]. =  cvRandInt  (& rng )   %  size ;
    
if   ( pts [ i ]. >   50   *  cos  ( pts [ i ]. *  CV_PI  /   100 )   +   200 )   {
      cvLine 
( img ,  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. +   2 ),  CV_RGB  ( 255 ,   0 ,   0 ));
      cvLine 
( img ,  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. +   2 ),  CV_RGB  ( 255 ,   0 ,   0 ));
      res
[ i ]   =   1 ;
    
}
    
else   {
      
if   ( pts [ i ]. >   200 )   {
        cvLine 
( img ,  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. +   2 ),  CV_RGB  ( 0 ,   255 ,   0 ));
        cvLine 
( img ,  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. +   2 ),  CV_RGB  ( 0 ,   255 ,   0 ));
        res
[ i ]   =   2 ;
      
}
      
else   {
        cvLine 
( img ,  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. +   2 ),  CV_RGB  ( 0 ,   0 ,   255 ));
        cvLine 
( img ,  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. +   2 ),  CV_RGB  ( 0 ,   0 ,   255 ));
        res
[ i ]   =   3 ;
      
}
    
}
  
}

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

  
// (4)学習パラメータの生成
  
for   ( =   0 ;  i  <  s ;  i ++)   {
    data
[ *   2 ]   =   float   ( pts [ i ]. x )   /  size ;
    data
[ *   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   ( =   0 ;  i  <  size ;  i ++)   {
    
for   ( =   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   ( =   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 ]. -   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. +   2 ),  rcolor );
    cvLine 
( img ,  cvPoint  ( pts [ i ]. +   2 ,  pts [ i ]. -   2 ),  cvPoint  ( pts [ i ]. -   2 ,  pts [ i ]. +   2 ),  rcolor );
  
}

  
// (8)サポートベクターの描画
  sv_num 
=  svm . get_support_vector_count  ();
  
for   ( =   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;
}
本文引用地址:http://blog.sciencenet.cn/blog-571755-591520.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值