學習OpenCV——HOG+SVM

  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. }  
發佈了77 篇原創文章 · 獲贊 103 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章