Object Recognition and Scene Understanding(四)OpenCV SVM+HOG分類

來源:互聯網
上載者:User

通過前面的介紹,可以對hog特徵利用svm訓練,得到簡單的二分類模型,利用分類模型可以實現二分。

參考:http://blog.csdn.net/yongshengsilingsa/article/details/7535496

 

OpenCV官方的SVM代碼在http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

在http://blog.csdn.net/sangni007/article/details/7471222看到一段還不錯的代碼,結構清楚,雖然注釋比較少,但很有參考價值。

 

需要自己設定一片大小,因為太懶,直接把改好的程式放過來:

#include "stdafx.h"#include "cv.h"  #include "highgui.h"  #include "stdafx.h"  #include <ml.h>  #include <iostream>  #include <fstream>  #include <string>  #include <vector>  using namespace cv;  using namespace std;      int main(int argc, char** argv)    {    int ImgWidht = 120;int ImgHeight = 120;    vector<string> img_path;      vector<int> img_catg;      int nLine = 0;      string buf;      ifstream svm_data( "E:/apple/SVM_DATA.txt" );      unsigned long n;        while( svm_data )      {          if( getline( svm_data, buf ) )          {              nLine ++;              if( nLine < 5 )              {  img_catg.push_back(1);img_path.push_back( buf );//映像路徑             }              else              {  img_catg.push_back(0);img_path.push_back( buf );//映像路徑             }          }      }      svm_data.close();//關閉檔案        Mat data_mat, res_mat;      int nImgNum = nLine;            //讀入樣本數量      ////樣本矩陣,nImgNum:橫座標是樣本數量, WIDTH * HEIGHT:樣本特徵向量,即映像大小  //data_mat = Mat::zeros( nImgNum, 12996, CV_32FC1 );        //類型矩陣,儲存每個樣本的類型標誌      res_mat = Mat::zeros( nImgNum, 1, CV_32FC1 );        Mat src;      Mat trainImg = Mat::zeros(ImgHeight, ImgWidht, CV_8UC3);//需要分析的圖片        for( string::size_type i = 0; i != img_path.size(); i++ )      {  src = imread(img_path[i].c_str(), 1);             cout<<" processing "<<img_path[i].c_str()<<endl;           resize(src, trainImg, cv::Size(ImgWidht,ImgHeight), 0, 0, INTER_CUBIC);        HOGDescriptor *hog=new HOGDescriptor(cvSize(ImgWidht,ImgHeight),cvSize(16,16),cvSize(8,8),cvSize(8,8), 9);  //具體意思見參考文章1,2             vector<float>descriptors;//結果數組             hog->compute(trainImg, descriptors, Size(1,1), Size(0,0)); //調用計算函數開始計算if (i==0){ data_mat = Mat::zeros( nImgNum, descriptors.size(), CV_32FC1 ); //根據輸入圖片大小進行分配空間 }        cout<<"HOG dims: "<<descriptors.size()<<endl;           n=0;          for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)          {  data_mat.at<float>(i,n) = *iter;              n++;          }          //cout<<SVMtrainMat->rows<<endl;      res_mat.at<float>(i, 0) =  img_catg[i];          cout<<" end processing "<<img_path[i].c_str()<<" "<<img_catg[i]<<endl;      }                     CvSVM svm = CvSVM();    CvSVMParams param;      CvTermCriteria criteria;        criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );        param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );   /*        SVM種類:CvSVM::C_SVC        Kernel的種類:CvSVM::RBF        degree:10.0(此次不使用)        gamma:8.0        coef0:1.0(此次不使用)        C:10.0        nu:0.5(此次不使用)        p:0.1(此次不使用)        然後對訓練資料正規化處理,並放在CvMat型的數組裡。                                                            */           //☆☆☆☆☆☆☆☆☆(5)SVM學習☆☆☆☆☆☆☆☆☆☆☆☆             svm.train( data_mat, res_mat, Mat(), Mat(), param );        //☆☆利用訓練資料和確定的學習參數,進行SVM學習☆☆☆☆         svm.save( "E:/apple/SVM_DATA.xml" );       //檢測樣本      vector<string> img_tst_path;      ifstream img_tst( "E:/apple/SVM_TEST.txt" );      while( img_tst )      {          if( getline( img_tst, buf ) )          {              img_tst_path.push_back( buf );          }      }      img_tst.close();    Mat test;    char line[512];      ofstream predict_txt( "E:/apple/SVM_PREDICT.txt" );      for( string::size_type j = 0; j != img_tst_path.size(); j++ )      {          test = imread( img_tst_path[j].c_str(), 1);//讀入映像           resize(test, trainImg, cv::Size(ImgWidht,ImgHeight), 0, 0, INTER_CUBIC);//要搞成同樣的大小才可以檢測到               HOGDescriptor *hog=new HOGDescriptor(cvSize(ImgWidht,ImgHeight),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具體意思見參考文章1,2             vector<float>descriptors;//結果數組             hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //調用計算函數開始計算hogcout<<"The Detection Result:"<<endl;        cout<<"HOG dims: "<<descriptors.size()<<endl;          Mat SVMtrainMat =  Mat::zeros(1,descriptors.size(),CV_32FC1);          n=0;          for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)          {  SVMtrainMat.at<float>(0,n) = *iter;              n++;          }            int ret = svm.predict(SVMtrainMat);  std::sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret ); printf("%s %d\r\n", img_tst_path[j].c_str(), ret);getchar();        predict_txt<<line;      }      predict_txt.close();    return 0;  } 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.