zoukankan      html  css  js  c++  java
  • OpenCV学习(37) 人脸识别(2)

          在前面一篇教程中,我们学习了OpenCV中基于特征脸的人脸识别的代码实现,我们通过代码

    Ptr<FaceRecognizer> model = createEigenFaceRecognizer();

    创建了人脸识别模型类,该识别模型类基于特征值人脸。该类有几个重要的成员:

    int _num_components;
    double _threshold;
    vector<Mat> _projections;
    Mat _labels;
    Mat _eigenvectors;
    Mat _eigenvalues;
    Mat _mean;

         _num_components表示我们的特征脸识别算法通过PCA降维后保留的特征向量数目,如果在创建人脸识别类时没有指定它的值,则它会保留所有的特征向量,比如我们例子中有399个采样图片,每个图片都为10304维,则最多的特征值数目为399,_num_components的值即为399。_threshold是判定输入的图像属于那一个特征脸时使用。如果类创建时候,没有指定它的值,则默认它会被赋予一个很大的值。我们可以通过下面的代码在类初始化时指定他们的值。

    int num_components = 10;
    double threshold = 10.0;
    Ptr<FaceRecognizer> model = createEigenFaceRecognizer(num_components, threshold);

    创建人脸识别模型类之后,我们首先要调用train函数:

    model->train(images, labels);

        该函数参数为样本图像集合以及样本图像标签集合,在该函数中,会通过PCA算法,得到采样集合的特征值和特征向量,并把每个采样图像投影到PCA子空间,放在变量 _projections中。所谓的投影PCA空间,就是用当前采样图向量减去均值向量,然后用特征向量乘以它,得到的y值。

    image

    详细参考http://www.cnblogs.com/mikewolf2002/p/3432243.html

    进过train函数后,我就得到了一系列的PCA空间投影图。

    然后,我们会调用predict函数,传入带识别的人脸图像,该函数会返回检测到的人脸标签号。

    int predictedLabel = model->predict(testSample);

       在该函数中,会首先把testSample投影到PCA空间,然后和_projections中保存的特征图像挨个比较,距离最近的特征图标签号即为输入图像对应的人。注意在比较中,用到域值_threshold,如果所有特征图距离都大于域值,则会返回-1,没有在模型中找到对应的人脸。

    for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
        double dist = norm(_projections[sampleIdx], q, NORM_L2);
       if((dist < minDist) && (dist < _threshold)) {
            minDist = dist;
            minClass = _labels.at<int>((int)sampleIdx);
        }
    }

    人脸识别模型类中还有两个重要的函数:load, save,我们在工程FirstOpenCV31中增加save函数:

    model->save("face.data");

    在工程FirstOpenCV33中,我们跳过train环节,直接load, face.data,这样可以加快程序执行速度。

    model->load("face.data");

    程序代码:FirstOpenCV31,FirstOpenCV33

     

  • 相关阅读:
    linux下文件/目录的默认权限
    linux中如何查看文件/文件夹的大小
    linux定时/计划任务
    shell脚本中EOF的妙用
    linux中的计算器
    linux操作系统的时间
    Anaconda如何设置网络代理
    前端学习问题积累
    angular-ng-zorro,自定义模态窗拖动指令
    angular学习笔记之父子传值
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/3434287.html
Copyright © 2011-2022 走看看