(八)OpenCV人脸识别_05_FisherFace算法

本文介绍了FisherFace算法,该算法基于LDA原理,旨在通过最大化类间方差和最小化类内方差来实现人脸识别。流程包括数据预处理、计算特征向量并进行子空间投影。与PCA不同,FisherFace更注重区分不同类别。
摘要由CSDN通过智能技术生成
  1. LDA原理(在低维表示下,相同的类应该紧紧的聚在一起,而不同的类别尽量距离越远)
    统计学方法(Fisher)
    最大类间方差
    最小类内方差
  2. 过程:
    输入数据->减去均值->计算离散矩阵->计算特征值与特征向量->计算前K个最大特征值对应特征向量->投影到子空间->终止
  3. PCA与LDA差别
    PCA:每个主成分轴指向最大方差方向
    LDA:最大化主成分轴在不同类之间
Ptr<BasicFaceRecognizer> model = FisherFaceRecognizer::create();
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
#include <iostream>

using namespace std;
using namespace cv;
using namespace cv::face;

//OpenCV人脸识别https://www.cnblogs.com/guoming0000/archive/2012/09/27/2706019.html

int main(int argc, char** argv)
{
   
	String filename = string("face_image.txt");//标签Label_Text文件
	//从硬盘到内存
	ifstream file(filename.c_str(), ifstream::in);c_str()函数可用可不用,无需返回一个标准C类型的字符串
	if (!file)//打开标签文件失败
	{
   
		cout << "could not load label_file" << endl;
		return -1;
	}

	string line, path, classlabel;
	vector<Mat> images;//存放图像数据
	vector<int> labels;//存放图像标签
	char separator = ';';//分号

	while (getline(file, line)) //getline(cin,inputLine)//cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称
	{
   
		stringstream liness(line);//这里采用stringstream主要作用是做字符串的分割
		getline(liness, path, separator)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值