基于opencv人脸识别

一、准备

    所有代码上传至 https://pan.baidu.com/s/1ETUetRnU83iytb6ZcE5GUQ  提取码:0jei 

    环境:win10,vs2013,opencv3.2

二、原理

原理1.PCA(主成分分析)原

通过对高维数据分析发现他们的相同与不同表达为 一个低维数据模式

主成分不变 

细微损失 

高维数据到低维数据

原理2.API调用

主要是使用其中的三个函数,来训练自己的数据,函数如下:

// train it
	Ptr model = createEigenFaceRecognizer();
	model->train(images, labels);
	model->save("D:/else/wyz/led_wyz.xml");
	
	Ptr model1 = createFisherFaceRecognizer();
	model1->train(images, labels);
	model1->save("MyFaceFisherModel.xml");

	Ptr model2 = createLBPHFaceRecognizer();
	model2->train(images, labels);
	model2->save("MyFaceLBPHModel.xml");
	

三、步骤

1. 算法实现步骤

  1. 数据:ORL  att_faces   OpenCV的数据 10个人、每人10张照片
  2. 一个图像N宽*N高*N个  112*92*100个矩阵
  3. 平均脸 矩阵计算得到均值
  4. 特征脸 矩阵计算得到特征值
  5. 开始、读训练数据、计算平均脸、计算协方差矩阵、计算特征值、特征矩阵、 PAC降维、子空间模型、检测
  6. 生成CSV文件
  7. 生成自己的xml
  8. 训练
  9. 识别
  10.  识别率
  11.  结果分析

四、结果

结果1.方差均值作用

图像RGB矩阵

空白背景方差不为0,均值为0

基于opencv人脸识别_第1张图片

基于opencv人脸识别_第2张图片

基于opencv人脸识别_第3张图片

结果2.PCA应用

  1. 灰度图像
  2. 描边,画出边缘

    基于opencv人脸识别_第4张图片

  1. XY表示所有轮廓,N*X*Y
  2. PCA处理,得到协方差矩阵,得到特征值特征向量

             N行2列表示所有的点

             得到轮廓中心位置

基于opencv人脸识别_第5张图片

             Eigen得到特征值

基于opencv人脸识别_第6张图片

结果3..Eigenface算法

  1. 数据:ORL  att_faces   OpenCV的数据 10个人、每人10张照片

      基于opencv人脸识别_第7张图片

      平均脸

      基于opencv人脸识别_第8张图片

      2. 一个图像N宽*N高*N个  112*92*100个矩阵

      3.平均脸 矩阵计算得到均值

      4.特征脸 矩阵计算得到特征值

      5.开始、读训练数据、计算平均脸、计算协方差矩阵、计算特征值、特征矩阵、 PAC降维、子空间模型、检测

      6.生成CSV文件

      7.生成自己的xml

       

     8.训练

     9.识别

       

    10. 识别率:

         基于opencv人脸识别_第9张图片

         基于opencv人脸识别_第10张图片

     11. 侧脸影响

        基于opencv人脸识别_第11张图片

     12.暗光条件下,找不到人脸,识别率也降低

        

结果4.Fisher算法

  1. 由fisher发现,于是命名FisherFace
  2. 基于LDA降维,求两个对象之间的内差和外差,得到离散矩阵,求特征值特 征向量
  3. FishFace识别在光照上有所进步,光的明暗影响不是很大

        

     4.识别率问题,因为这里光亮作为主要因素,光亮无法做到细微控制,这里不做详细比较

       基于opencv人脸识别_第12张图片

     5.人脸上半部分处在黑暗环境,与EigenFace比较,差不多同一张图片,这张图能识别出来

      基于opencv人脸识别_第13张图片

结果5.LBPH算法

此算法和前两种的比较,主要是在光照和侧脸角度上有所加强,这里不再多做比较。

你可能感兴趣的:(机器学习)