測試 svm 訓練的xml 分類器 ~

用 svm 訓練了個分類器。

給圖片分類的。

目標 : 1

else : 0


載入分類器查看效果



#include "stdafx.h"
#include "cv.h"  
#include "highgui.h"    
#include <ml.h>  
#include <iostream>  
#include <fstream>  
#include <string>  
#include <vector>  

using namespace cv;  
using namespace std;  
  
  
int main(int argc, char** argv)    
{    
  
	
	CvSVM svm = CvSVM();//新建一個SVM
	svm.load("SVM_DATA.xml", 0);

	//if(svm == NULL)
	//{
	//	printf("Cant load ur xml!\n");
	//}

	CvCapture *video = cvCaptureFromAVI("D:\\video\\s.avi");
	IplImage *test = NULL; //從視頻中抓取的一幀
	IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3); //its size must = img's size which used to train ur xml

	ofstream predict_txt( "SVM_PREDICT.txt" );//把預測結果存儲在這個文本中  
	int cnt = 0; //用來標記第幾幀

	cvNamedWindow( "video");  

	while(1)
	{
		test = cvQueryFrame(video);
		if(test == NULL)
		{
			break;
		}
		else
		{


			char line[512];  
			cvZero(trainImg);  
			cvResize(test,trainImg);   //讀取圖片  
			HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),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)); //調用計算函數開始計算     
			cout<<"HOG dims: "<<descriptors.size()<<endl;  
			CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);  
			int  n = 0;  
			for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)  
			{  
				cvmSet(SVMtrainMat,0,n,*iter);  
				n++;  
			}  
	   
			int ret = svm.predict(SVMtrainMat);//獲取最終檢測結果,這個predict的用法見 OpenCV的文檔 
			std::sprintf( line, "Frame :  %d\r\n",  ret );  
			predict_txt<<line;  	
			
			if(ret == 1)
			{
				CvFont font;   //定義字體結構體
				cvInitFont(&font,0,1.0,1.0,0,2,8);  //初始化字體結構體
				char* warn=" Target!!!";
				cvPutText(test, sun,cvPoint(10,10),&font,CV_RGB(255, 0, 0));   //在窗口中顯示warning的紅色提示信息
			}

			cvShowImage("video", test);
			cvWaitKey(20);
		}
	}
  
    cvReleaseImage( &trainImg);  
	predict_txt.close();  
	system("PAUSE");
	
	return 0;  
}  



測試某個 目錄 下的圖片:


#include "stdafx.h"
#include "cv.h"  
#include "highgui.h"    
#include <ml.h>  
#include <iostream>  
#include <fstream>  
#include <string>  
#include <vector>  

using namespace cv;  
using namespace std;  


int main(int argc, char** argv)    
{    


	CvSVM svm = CvSVM();//新建一個SVM
	svm.load("F:\\test\\SVM_DATA.xml", 0);

	//if(svm == NULL)
	//{
	//	printf("Cant load ur xml!\n");
	//}
	cout<<" load xml"<<endl;

	string buf;
	int n = 0;
	IplImage *test;  
	vector<string> img_tst_path;  
	ifstream img_tst( "F:\\test\\test.txt" );//同輸入訓練樣本,這裏也是一樣的,只不過不需要標註圖片屬於哪一類了
	while( img_tst )  
	{  
		if( getline( img_tst, buf ) )  
		{  
			img_tst_path.push_back( buf );  
		}  
	}  
	img_tst.close();  


	IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的圖片,這裏默認設定圖片是64*64大小,所以上面定義了1764,如果要更改圖片大小,可以先用debug查看一下descriptors是多少,然後設定好再運行  

	CvMat *test_hog = cvCreateMat( 1, 1764, CV_32FC1 );//注意這裏的1764,同上面一樣  
	char line[512];  
	ofstream predict_txt( "F:\\test\\SVM_PREDICT.txt" );//把預測結果存儲在這個文本中  
	for( string::size_type j = 0; j != img_tst_path.size(); j++ )//依次遍歷所有的待檢測圖片  
	{  
		test = cvLoadImage( img_tst_path[j].c_str(), 1);  
		if( test == NULL )  
		{  
			cout<<" can not load the image: "<<img_tst_path[j].c_str()<<endl;  
			continue;  
		}  

		cvZero(trainImg);  
		cvResize(test,trainImg);   //讀取圖片     
		HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),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)); //調用計算函數開始計算     
		cout<<"HOG dims: "<<descriptors.size()<<endl;  
		CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);  
		n=0;  
		for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)  
		{  
			cvmSet(SVMtrainMat,0,n,*iter);  
			n++;  
		}  

		int ret = svm.predict(SVMtrainMat);//獲取最終檢測結果,這個predict的用法見 OpenCV的文檔 
		std::sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );  
		predict_txt<<line;  
	}  
	predict_txt.close();  


	cvReleaseImage(&trainImg);

	system("PAUSE");

	return 0;  
}  


發佈了145 篇原創文章 · 獲贊 47 · 訪問量 118萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章