SVM+HOG

http://blog.csdn.net/raocong2010/article/details/6239431

http://blog.sciencenet.cn/blog-261330-548546.html

http://blog.csdn.net/sangni007/article/details/7471222

  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. }  

 

你可能感兴趣的:(SVM+HOG)