#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <iterator>
using namespace cv;
using namespace std;
#include <fstream>
int _tmain(int argc, _TCHAR* argv[])
{
//
#define len 3600
vector<string> img_path;
vector<int> img_catg;
int nLine = 0;
string buf;
ifstream svm_data( "1.txt" );
while( svm_data )
{
if( getline( svm_data, buf ) )
{
if( nLine % 2 == 1 )
{
img_catg.push_back( atoi( buf.c_str() ) );
}
else
{
img_path.push_back( buf );
}
nLine ++;
}
}
svm_data.close();
/************************训练程序*************************/
Mat data_Mat;
int nImgNum = nLine / 2;
Mat srcImg_,sampleImg_;
vector<float> descriptor;
for( string::size_type i = 0; i != img_path.size(); i++ )
{
srcImg_ = imread(img_path[i].c_str());
if( srcImg_.empty())
{
cout<<" can not load the image: "<<img_path[i].c_str()<<endl;
continue;
}
/*Mat src(48,48,CV_8UC3);//归一化的大小
Size dsize(48,48);
resize(srcImg_,src,dsize);
hog_.compute(src,descriptor);*/
descriptor = vec(srcImg_);//计算出自己需要的特征存放在descriptor.自己写的函数可以替换为HOG等特征
Mat des(descriptor);
Mat des_=des.reshape(1,1);
data_Mat.push_back(des_);//特征矩阵,一行为一个特征。
//cout<<" end processing "<<img_path[i].c_str()<<" "<<img_catg[i]<<endl;
descriptor.clear();
}
cout<<" end processing "<<endl;
Mat res_Mat(img_catg);
CvSVM svm = CvSVM();
CvSVMParams param;
CvTermCriteria criteria;
criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );
param = CvSVMParams( CvSVM::C_SVC, CvSVM::LINEAR, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );
svm.train(data_Mat,res_Mat,Mat(),Mat(),param);//训练的data_Mat数据必须为归一化的浮点数
svm.save( "1.xml" );