测试 svm 训练的xml 分类器 ~

用 svm 训练了个分类器。

给图片分类的。

目标 : 1

else : 0


载入分类器查看效果



[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include "cv.h"    
  3. #include "highgui.h"      
  4. #include     
  5. #include     
  6. #include     
  7. #include     
  8. #include     
  9.   
  10. using namespace cv;    
  11. using namespace std;    
  12.     
  13.     
  14. int main(int argc, char** argv)      
  15. {      
  16.     
  17.       
  18.     CvSVM svm = CvSVM();//新建一个SVM  
  19.     svm.load("SVM_DATA.xml", 0);  
  20.   
  21.     //if(svm == NULL)  
  22.     //{  
  23.     //  printf("Cant load ur xml!\n");  
  24.     //}  
  25.   
  26.     CvCapture *video = cvCaptureFromAVI("D:\\video\\s.avi");  
  27.     IplImage *test = NULL; //从视频中抓取的一帧  
  28.     IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3); //its size must = img's size which used to train ur xml  
  29.   
  30.     ofstream predict_txt( "SVM_PREDICT.txt" );//把预测结果存储在这个文本中    
  31.     int cnt = 0; //用来标记第几帧  
  32.   
  33.     cvNamedWindow( "video");    
  34.   
  35.     while(1)  
  36.     {  
  37.         test = cvQueryFrame(video);  
  38.         if(test == NULL)  
  39.         {  
  40.             break;  
  41.         }  
  42.         else  
  43.         {  
  44.   
  45.   
  46.             char line[512];    
  47.             cvZero(trainImg);    
  48.             cvResize(test,trainImg);   //读取图片    
  49.             HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具体意思见参考文章1,2       
  50.             vector<float> descriptors;//结果数组       
  51.             hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算       
  52.             cout<<"HOG dims: "<
  53.             CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);    
  54.             int  n = 0;    
  55.             for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
  56.             {    
  57.                 cvmSet(SVMtrainMat,0,n,*iter);    
  58.                 n++;    
  59.             }    
  60.          
  61.             int ret = svm.predict(SVMtrainMat);//获取最终检测结果,这个predict的用法见 OpenCV的文档   
  62.             std::sprintf( line, "Frame :  %d\r\n",  ret );    
  63.             predict_txt<
  64.               
  65.             if(ret == 1)  
  66.             {  
  67.                 CvFont font;   //定义字体结构体  
  68.                 cvInitFont(&font,0,1.0,1.0,0,2,8);  //初始化字体结构体  
  69.                 char* warn=" Target!!!";  
  70.                 cvPutText(test, sun,cvPoint(10,10),&font,CV_RGB(255, 0, 0));   //在窗口中显示warning的红色提示信息  
  71.             }  
  72.   
  73.             cvShowImage("video", test);  
  74.             cvWaitKey(20);  
  75.         }  
  76.     }  
  77.     
  78.     cvReleaseImage( &trainImg);    
  79.     predict_txt.close();    
  80.     system("PAUSE");  
  81.       
  82.     return 0;    
  83. }    



测试某个 目录 下的图片:


[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include "cv.h"    
  3. #include "highgui.h"      
  4. #include     
  5. #include     
  6. #include     
  7. #include     
  8. #include     
  9.   
  10. using namespace cv;    
  11. using namespace std;    
  12.   
  13.   
  14. int main(int argc, char** argv)      
  15. {      
  16.   
  17.   
  18.     CvSVM svm = CvSVM();//新建一个SVM  
  19.     svm.load("F:\\test\\SVM_DATA.xml", 0);  
  20.   
  21.     //if(svm == NULL)  
  22.     //{  
  23.     //  printf("Cant load ur xml!\n");  
  24.     //}  
  25.     cout<<" load xml"<
  26.   
  27.     string buf;  
  28.     int n = 0;  
  29.     IplImage *test;    
  30.     vector img_tst_path;    
  31.     ifstream img_tst( "F:\\test\\test.txt" );//同输入训练样本,这里也是一样的,只不过不需要标注图片属于哪一类了  
  32.     while( img_tst )    
  33.     {    
  34.         if( getline( img_tst, buf ) )    
  35.         {    
  36.             img_tst_path.push_back( buf );    
  37.         }    
  38.     }    
  39.     img_tst.close();    
  40.   
  41.   
  42.     IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片,这里默认设定图片是64*64大小,所以上面定义了1764,如果要更改图片大小,可以先用debug查看一下descriptors是多少,然后设定好再运行    
  43.   
  44.     CvMat *test_hog = cvCreateMat( 1, 1764, CV_32FC1 );//注意这里的1764,同上面一样    
  45.     char line[512];    
  46.     ofstream predict_txt( "F:\\test\\SVM_PREDICT.txt" );//把预测结果存储在这个文本中    
  47.     for( string::size_type j = 0; j != img_tst_path.size(); j++ )//依次遍历所有的待检测图片    
  48.     {    
  49.         test = cvLoadImage( img_tst_path[j].c_str(), 1);    
  50.         if( test == NULL )    
  51.         {    
  52.             cout<<" can not load the image: "<
  53.             continue;    
  54.         }    
  55.   
  56.         cvZero(trainImg);    
  57.         cvResize(test,trainImg);   //读取图片       
  58.         HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具体意思见参考文章1,2       
  59.         vector<float>descriptors;//结果数组       
  60.         hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算       
  61.         cout<<"HOG dims: "<
  62.         CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);    
  63.         n=0;    
  64.         for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
  65.         {    
  66.             cvmSet(SVMtrainMat,0,n,*iter);    
  67.             n++;    
  68.         }    
  69.   
  70.         int ret = svm.predict(SVMtrainMat);//获取最终检测结果,这个predict的用法见 OpenCV的文档   
  71.         std::sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );    
  72.         predict_txt<
  73.     }    
  74.     predict_txt.close();    
  75.   
  76.   
  77.     cvReleaseImage(&trainImg);  
  78.   
  79.     system("PAUSE");  
  80.   
  81.     return 0;    
  82. }    

你可能感兴趣的:(图像处理)