OpenCV操作SVM+HOG

[cpp]  view plain copy
  1. #include "cv.h"     
  2. #include "highgui.h"     
  3. #include "stdafx.h"     
  4. #include <ml.h>     
  5. #include <iostream>     
  6. #include <fstream>     
  7. #include <string>     
  8. #include <vector>     
  9. using namespace cv;    
  10. using namespace std;    
  11.     
  12.     
  13. int main(int argc, char** argv)      
  14. {      
  15.     vector<string> img_path;    
  16.     vector<int> img_catg;    
  17.     int nLine = 0;    
  18.     string buf;    
  19.     ifstream svm_data( "E:/SVM_DATA.txt" );    
  20.     unsigned long n;    
  21.     
  22.     while( svm_data )    
  23.     {    
  24.         if( getline( svm_data, buf ) )    
  25.         {    
  26.             nLine ++;    
  27.             if( nLine % 2 == 0 )    
  28.             {    
  29.                  img_catg.push_back( atoi( buf.c_str() ) );//atoi将字符串转换成整型,标志(0,1)     
  30.             }    
  31.             else    
  32.             {    
  33.                 img_path.push_back( buf );//图像路径     
  34.             }    
  35.         }    
  36.     }    
  37.     svm_data.close();//关闭文件     
  38.     
  39.     CvMat *data_mat, *res_mat;    
  40.     int nImgNum = nLine / 2;            //读入样本数量     
  41.     样本矩阵,nImgNum:横坐标是样本数量, WIDTH * HEIGHT:样本特征向量,即图像大小     
  42.     data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 );    
  43.     cvSetZero( data_mat );    
  44.     //类型矩阵,存储每个样本的类型标志     
  45.     res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );    
  46.     cvSetZero( res_mat );    
  47.     
  48.     IplImage* src;    
  49.     IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片     
  50.     
  51.     for( string::size_type i = 0; i != img_path.size(); i++ )    
  52.     {    
  53.             src=cvLoadImage(img_path[i].c_str(),1);    
  54.             if( src == NULL )    
  55.             {    
  56.                 cout<<" can not load the image: "<<img_path[i].c_str()<<endl;    
  57.                 continue;    
  58.             }    
  59.     
  60.             cout<<" processing "<<img_path[i].c_str()<<endl;    
  61.                    
  62.             cvResize(src,trainImg);   //读取图片        
  63.             HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具体意思见参考文章1,2        
  64.             vector<float>descriptors;//结果数组        
  65.             hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算        
  66.             cout<<"HOG dims: "<<descriptors.size()<<endl;    
  67.             //CvMat* SVMtrainMat=cvCreateMat(descriptors.size(),1,CV_32FC1);     
  68.             n=0;    
  69.             for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
  70.             {    
  71.                 cvmSet(data_mat,i,n,*iter);    
  72.                 n++;    
  73.             }    
  74.                 //cout<<SVMtrainMat->rows<<endl;     
  75.             cvmSet( res_mat, i, 0, img_catg[i] );    
  76.             cout<<" end processing "<<img_path[i].c_str()<<" "<<img_catg[i]<<endl;    
  77.     }    
  78.         
  79.                  
  80.     CvSVM svm = CvSVM();      
  81.     CvSVMParams param;      
  82.     CvTermCriteria criteria;      
  83.     criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );      
  84.     param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );      
  85. /*     
  86.     SVM种类:CvSVM::C_SVC     
  87.     Kernel的种类:CvSVM::RBF     
  88.     degree:10.0(此次不使用)     
  89.     gamma:8.0     
  90.     coef0:1.0(此次不使用)     
  91.     C:10.0     
  92.     nu:0.5(此次不使用)     
  93.     p:0.1(此次不使用)     
  94.     然后对训练数据正规化处理,并放在CvMat型的数组里。     
  95.                                                         */         
  96.     //☆☆☆☆☆☆☆☆☆(5)SVM学习☆☆☆☆☆☆☆☆☆☆☆☆            
  97.     svm.train( data_mat, res_mat, NULL, NULL, param );      
  98.     //☆☆利用训练数据和确定的学习参数,进行SVM学习☆☆☆☆        
  99.     svm.save( "SVM_DATA.xml" );      
  100.     
  101.     //检测样本     
  102.     IplImage *test;    
  103.     vector<string> img_tst_path;    
  104.     ifstream img_tst( "E:/SVM_TEST.txt" );    
  105.     while( img_tst )    
  106.     {    
  107.         if( getline( img_tst, buf ) )    
  108.         {    
  109.             img_tst_path.push_back( buf );    
  110.         }    
  111.     }    
  112.     img_tst.close();    
  113.     
  114.     
  115.     
  116.     CvMat *test_hog = cvCreateMat( 1, 1764, CV_32FC1 );    
  117.     char line[512];    
  118.     ofstream predict_txt( "SVM_PREDICT.txt" );    
  119.     for( string::size_type j = 0; j != img_tst_path.size(); j++ )    
  120.     {    
  121.         test = cvLoadImage( img_tst_path[j].c_str(), 1);    
  122.         if( test == NULL )    
  123.         {    
  124.              cout<<" can not load the image: "<<img_tst_path[j].c_str()<<endl;    
  125.                continue;    
  126.          }    
  127.             
  128.         cvZero(trainImg);    
  129.         cvResize(test,trainImg);   //读取图片        
  130.         HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具体意思见参考文章1,2        
  131.         vector<float>descriptors;//结果数组        
  132.         hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算        
  133.         cout<<"HOG dims: "<<descriptors.size()<<endl;    
  134.         CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);    
  135.         n=0;    
  136.         for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
  137.             {    
  138.                 cvmSet(SVMtrainMat,0,n,*iter);    
  139.                 n++;    
  140.             }    
  141.     
  142.         int ret = svm.predict(SVMtrainMat);    
  143.         sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );    
  144.          predict_txt<<line;    
  145.     }    
  146.     predict_txt.close();    
  147.     
  148. //cvReleaseImage( &src);     
  149. //cvReleaseImage( &sampleImg );     
  150. //cvReleaseImage( &tst );     
  151. //cvReleaseImage( &tst_tmp );     
  152. cvReleaseMat( &data_mat );    
  153. cvReleaseMat( &res_mat );    
  154.     
  155. return 0;    
  156. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值