pca svm识别人脸

来源:互联网 发布:人流量 检测 知乎 编辑:程序博客网 时间:2024/06/09 22:31
void SVMTRAINCLASS::OnBnClickedButtonsvmtrain(){// TODO: Add your control notification handler code herechar 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);   //}    }

0 0
原创粉丝点击