void SVMTRAINCLASS::OnBnClickedButtonsvmtrain()
{
// TODO: Add your control notification handler code here
char filename[100];
static CvSVM svm ;
static int isflag=0;
vector<Mat> images; //This variable will be loaded with a set of images to perform PCA on.
int nEigens;
vector<FILELABEL> faceBank;
vector<CString> nonFaceBank;
int num = 0;
Mat src;
//vector<FILELABEL> faceBank;
//vector<CString> nonFaceBank;
CString pospath,negpath;
GetDlgItemText(IDC_EDITSAMPLEFILE,pospath);
GetDlgItemText(IDC_EDITSAMPLEFILE2,negpath);
if(strlen(pospath)==0||strlen(negpath)==0)return;
GetSubDirFiles(pospath,faceBank,0);
GetDirFiles(negpath,nonFaceBank);
int div =0;
div=GetDlgItemInt(IDC_COMBOTEZHENGFANGFA);
int imageFaceNum = faceBank.size()/div;
int imageNonFaceNum = nonFaceBank.size()/div;
Mat values(imageFaceNum+imageNonFaceNum, 1, CV_32SC1); //Values are the corresponding values to each of my images.
print("load face");
int r=GetDlgItemInt(IDC_EDIT6);
int w=GetDlgItemInt(IDC_EDIT7);
for(int i=1; i<=imageFaceNum; i++) {
//sprintf(filename,"C:/img/face/MIT/MIT/faces/%d.bmp",i);
values.at<int>(i-1,0) = faceBank[i-1].label;
src=cvLoadImage(faceBank[i-1].name,0);
resize(src,src,Size(r,w));
images.push_back(src);
num++;
}
print("load unface");
for(int i=1; i<=imageNonFaceNum; i++) {
//sprintf(filename,"C:/img/face/MIT/MIT/nonfaces/%d.bmp",i);
values.at<int>(imageFaceNum+i-1,0) = -1;
src=cvLoadImage(nonFaceBank[i-1],0);
resize(src,src,Size(r,w));
images.push_back(src);
num++;
}
nEigens = images.size() - 1; //Number of Eigen Vectors.
//Load the images into a Matrix
Mat desc_mat(images.size(), images[0].rows * images[0].cols, CV_8UC1);
print("merge mat");
for (int i=0; i<images.size(); i++) {
desc_mat.row(i) = images[i].reshape(1, 1) + 0;
}
Mat average;
static PCA pca(desc_mat, average, CV_PCA_DATA_AS_ROW, nEigens);
Mat data(desc_mat.rows, nEigens, CV_32FC1); //This Mat will contain all the Eigenfaces that will be used later with SVM for detection
//Project the images onto the PCA subspace
if(isflag==0){
print("do pca");
for(int i=0; i<images.size(); i++) {
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(desc_mat.row(i), projectedMat);
normalize(projectedMat,projectedMat,1.0);
data.row(i) = projectedMat.row(0) + 0;
}
}
CvMat d1 = (CvMat)data;
CvMat d2 = (CvMat)values;
if(isflag==0){
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 );
//☆☆☆☆☆☆☆☆☆(5)SVM学习☆☆☆☆☆☆☆☆☆☆☆☆
print("begin train....");
svm.train( &d1, &d2, NULL, NULL, param );
print("done");
isflag=1;
}
Mat cs;
// Mat cs1(1,400,CV_32FC1);
CString chessimg;
GetDlgItemText(IDC_EDITPREDICTFILE,chessimg);
src=cvLoadImage(chessimg,0);
Mat src0=cvLoadImage(faceBank[0].name,0);
cv::resize(src,src,Size(images[0].rows,images[0].cols));
cs = src.reshape(1, 1) + 0;
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(cs, projectedMat);
Mat mat=projectedMat+0;
//CvMat d3 = (CvMat)projectedMat;
normalize(projectedMat,projectedMat,1.0);
int ret = svm.predict(projectedMat);
print("%d",ret);
//for(int i=0; i<imageFaceNum; i++) {
// //sprintf(filename,"C:/img/face/MIT/MIT/faces/%d.bmp",i);
// src=cvLoadImage(faceBank[i],0);
// cs = src.reshape(1, 1) + 0;
// Mat projectedMat(1, nEigens, CV_32FC1);
// pca.project(cs, projectedMat);
// Mat mat=projectedMat+0;
// //CvMat d3 = (CvMat)projectedMat;
// normalize(projectedMat,projectedMat,1.0);
// int ret = svm.predict(projectedMat);
// print("%d",ret);
//}
}
pca svm识别人脸
最新推荐文章于 2024-12-05 12:47:48 发布