在QT平台上使用PCA+SVM实现人脸识别

@使用PCA+SVM实现人脸识别,正样本使用的ORL face database,负样本是自己创建的,使用的QT编程软件
,以下是源码`

 #include "mainwindow.h"
    #include <opencv2/opencv.hpp>
    #include <opencv\cv.h>
    #include <opencv\cxcore.h>
    #include <opencv\highgui.h>
    #include <QApplication>
    #include<QMessageBox>
    using namespace cv;
    using namespace std;
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
    
    }
    MainWindow::~MainWindow()
    {
    }
    int  MainWindow::video_capture()
    {
         vector<Mat> images; //This variable will be loaded with a set of images to perform PCA on.
         char filename[100];
         int imageFaceNum = 400;
         int imageNonFaceNum = 22;
         int num = 0;
         int num_face=0;
         Size size;
         Mat src;
         Mat values(imageFaceNum+imageNonFaceNum, 1, CV_32SC1); //Values are the corresponding values to each of my images.
         for(int i=1; i<=imageFaceNum/10; i++)
         for(int j=1;j<=10;j++)
         {
          sprintf(filename,"D:\\VS C++\\QT\\PCA+SVM\\ORL face database\\s%d\\%d.bmp",i,j);
          values.at<int>(num,0) = 1;
          src=imread(filename,0);
          size=Size(src.cols,src.rows);
    
          equalizeHist(src,src);
          waitKey(30);
          imshow("samples",src);
          images.push_back(src);
          num++;
          num_face++;
    
         }
    
         for(int i=1; i<=imageNonFaceNum; i++)
         {
          Mat dst(size,CV_8UC1);
          sprintf(filename,"D:\\VS C++\\QT\\PCA+SVM\\no face database\\%d.jpg",i);
    
          values.at<int>(num,0) = 0;
          src=imread(filename,0);
         cv:: resize(src,dst,size);
    
         equalizeHist(dst,dst);
          waitKey(30);
          imshow("samples",dst);
          images.push_back(dst);
          num++;
         }
         int nEigens = images.size()-200; //Number of Eigen Vectors.作为基坐标的特征向量个数
         //Load the images into a Matrix
         Mat desc_mat(num_face, images[0].rows * images[0].cols, CV_8UC1);
         Mat desc_mat1(images.size(), images[0].rows * images[0].cols, CV_8UC1);
    
         for (int i=0; i<num_face; i++)
         {
           desc_mat.row(i) = images[i].reshape(1, 1) ;
         }
         for (int i=0; i<images.size(); i++)
         {
           desc_mat1.row(i) = images[i].reshape(1, 1) ;
         }
         Mat average;
         PCA pca(desc_mat, average, CV_PCA_DATA_AS_ROW, nEigens);
         Mat data(images.size(), 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
         for(int i=0; i<images.size(); i++)
         {
           Mat projectedMat(1, nEigens, CV_32FC1);
           pca.project(desc_mat1.row(i), projectedMat);
           data.row(i) = projectedMat.row(0);
         }
          cout<<"data"<<data.size()<<endl;
          cout<<"values"<<values.size()<<endl;
         CvMat d1 = (CvMat)data;
         CvMat d2 = (CvMat)values;
         CvSVM svm;
         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学习☆☆☆☆☆☆☆☆☆☆☆☆
         svm.train( &d1, &d2, NULL, NULL, param );
         svm.save("svmdata.xml");


     Mat cs;
     src=imread("D:\\VS C++\\QT\\PCA+SVM\\1.bmp",0);
     equalizeHist(src,src);
     cs = src.reshape(1, 1) ;
     Mat projectedMat(1, nEigens, CV_32FC1);
     pca.project(cs, projectedMat);
     CvMat d3 = (CvMat)projectedMat;
     int ret = svm.predict(&d3);
     cout<<ret<<endl;
      waitKey(0);
      return 0;
    }

`

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCA+SVM 是一种经典的人脸识别方法,它的基本思路是将人脸图像进行降维,然后利用支持向量机(SVM)进行分类。 以下是一个简单的 PCA+SVM 人脸识别程序的示例: 1. 数据集准备 首先需要准备一个人脸数据集,可以使用公开的人脸数据集,如LFW数据集等。数据集中应该包含正面清晰的人脸图像。 2. 特征提取 利用主成分分析(PCA)对人脸图像进行降维,提取出人脸的主要特征。PCA 的具体实现可以使用Python中的sklearn库。 3. 训练模型 使用支持向量机(SVM)对提取的特征进行分类训练。同样,可以使用Python中的sklearn库实现SVM分类器。 4. 测试模型 使用测试集对训练好的模型进行测试。将测试集的图像经过PCA降维处理,然后输入到SVM分类器中进行分类。最后统计分类正确率以评估模型的准确性。 以下是一个简单的Python代码示例: ```python from sklearn.decomposition import PCA from sklearn.svm import SVC from sklearn.metrics import accuracy_score import numpy as np # 读入数据集 X = np.load('face_images.npy') y = np.load('face_labels.npy') # 划分训练集和测试集 X_train, y_train = X[:800], y[:800] X_test, y_test = X[800:], y[800:] # PCA降维 pca = PCA(n_components=100) X_train_pca = pca.fit_transform(X_train) X_test_pca = pca.transform(X_test) # SVM分类 clf = SVC() clf.fit(X_train_pca, y_train) # 测试模型 y_pred = clf.predict(X_test_pca) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 其中,`face_images.npy`和`face_labels.npy`是存储人脸图像和标签的文件。PCA降维后的特征向量为100维,SVM分类器使用默认参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值