PCA求取特征脸

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <string>

using namespace cv;
using namespace std;

void main() {

	int nsamples = 0;    //样本(图片)个数
	int w = 92;          //图片宽度(假定所有样本已知且统一)
	int h = 112;         //图片高度(假定所有样本已知且统一)

	string datasetfile;  //样本集文件路径
	string file;         //样本文件路径

	ifstream infile;

	Mat img, gray;
	Mat input;           //一个样本
	Mat inputs;          //样本数据矩阵
	Mat result;

	PCA pca;

	//1.输入样本数据
	cout << "Input the path of dataset file: ";
	cin >> datasetfile;
	infile.open(datasetfile.c_str());

	if (infile) {
		do {
			getline(infile, file);
			img = imread(file);

			cvtColor(img, gray, CV_BGR2GRAY);
			input = gray.reshape(1, 1);
			inputs.push_back(input);

			getline(infile, file);
		} while (!infile.eof());

		//2.进行PCA的相关计算

		//opencv的PCA类输入矩阵的数据类型要求为float型,既CV_32FC1或CV_64FC1
		inputs.convertTo(inputs, CV_32FC1);

		//最后的参数10,保留前10个最大的特征值及其对应的特征向量
		pca(inputs, Mat(), CV_PCA_DATA_AS_ROW, 10);

		//读取协方差矩阵的特征向量,并转换成样本(图片)的原尺寸h*w
		//row(0)表示读取第一个(特征值最大)的特征向量
		result = pca.eigenvectors.row(0);
		result = result.reshape(result.channels(), h);

		//将向量元素值的范围从浮点值映射到0~255,并将数据类型转换成unsigned char
		normalize(result, result, 0, 255, NORM_MINMAX, CV_8UC1);

		//显示一张特征脸
		imshow("eigenface1", result);
		waitKey();
	}
	else {
		cout << "error: unable to open input dataset file "<< endl;
	}
}

数据集文件样式(采用ORL数据集):
在这里插入图片描述
实验结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值