java利用opencv降维_【转】PCA算法学习_1(OpenCV中PCA实现人脸降维)

48304ba5e6f9fe08f3fa1abda7d326ab.png

#include "pcaface.h"

#include "ui_pcaface.h"

#include

#include

#include

using namespace std;

PCAFace::PCAFace(QWidget *parent) :

QDialog(parent),

ui(new Ui::PCAFace)

{

ui->setupUi(this);

src_face1 = imread("./images/1.pgm", 0);

//下面的代码为设置图片显示区域自适应图片的大小

ui->face1Browser->setFixedHeight(src_face1.rows+1);

ui->face1Browser->setFixedWidth(src_face1.cols+1);

ui->face2Browser->setFixedHeight(src_face1.rows+1);

ui->face2Browser->setFixedWidth(src_face1.cols+1);

ui->face3Browser->setFixedHeight(src_face1.rows+1);

ui->face3Browser->setFixedWidth(src_face1.cols+1);

ui->face4Browser->setFixedHeight(src_face1.rows+1);

ui->face4Browser->setFixedWidth(src_face1.cols+1);

ui->face5Browser->setFixedHeight(src_face1.rows+1);

ui->face5Browser->setFixedWidth(src_face1.cols+1);

ui->face6Browser->setFixedHeight(src_face1.rows+1);

ui->face6Browser->setFixedWidth(src_face1.cols+1);

ui->face7Browser->setFixedHeight(src_face1.rows+1);

ui->face7Browser->setFixedWidth(src_face1.cols+1);

ui->face8Browser->setFixedHeight(src_face1.rows+1);

ui->face8Browser->setFixedWidth(src_face1.cols+1);

ui->face9Browser->setFixedHeight(src_face1.rows+1);

ui->face9Browser->setFixedWidth(src_face1.cols+1);

for(int i = 1; i <= 15; i++)

{

stringstream ss;

string num;

ss<

ss>>num;//将字符串流中的数据传入num,这2句代码即把数字转换成字符

string image_name = ("./images/" + num + ".pgm");//需要读取的图片全名

src.push_back(imread(image_name, 0));

}

total= src[0].rows*src[0].cols;

}

PCAFace::~PCAFace()

{

delete ui;

}

void PCAFace::changeEvent(QEvent *e)

{

QDialog::changeEvent(e);

switch (e->type()) {

case QEvent::LanguageChange:

ui->retranslateUi(this);

break;

default:

break;

}

}

//将Mat内的内容归一化到0~255,归一化后的类型为但通道整型

Mat PCAFace::normalize(const Mat& src) {

Mat srcnorm;

cv::normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1);

return srcnorm;

}

void PCAFace::on_startButton_clicked()

{

//先显示3张原图

ui->face1Browser->append("1.pgm");

ui->face2Browser->append("7.pgm");

ui->face3Browser->append("14.pgm");

//mat数组用来存放读取进来的所有图片的数据,其中mat的每一列对应1张图片,该实现在下面的for函数中

Mat mat(total, src.size(), CV_32FC1);

for(int i = 0; i < src.size(); i++)

{

Mat col_tmp = mat.col(i);

src[i].reshape(1, total).col(0).convertTo(col_tmp, CV_32FC1, 1/255.);

}

int number_principal_compent = 12;//保留最大的主成分数

//构造pca数据结构

PCA pca(mat, Mat(), CV_PCA_DATA_AS_COL, number_principal_compent);

//pca.eigenvectors中的每一行代表输入数据协方差矩阵一个特征向量,且是按照该协方差矩阵的特征值进行排序的

pca_face1 = normalize(pca.eigenvectors.row(0)).reshape(1, src[0].rows);//第一个主成分脸

imwrite("./result/pca_face1.jpg", pca_face1);//显示主成分特征脸1

ui->face7Browser->append("pca_face1.jpg");

pca_face2 = normalize(pca.eigenvectors.row(1)).reshape(1, src[0].rows);//第二个主成分脸

imwrite("./result/pca_face2.jpg", pca_face2);//显示主成分特征脸2

ui->face8Browser->append("pca_face2.jpg");

pca_face3 = normalize(pca.eigenvectors.row(2)).reshape(1, src[0].rows);//第三个主成分脸

imwrite("./result/pca_face3.jpg", pca_face3);//显示主成分特征脸3

ui->face9Browser->append("pca_face3.jpg");

//将原始数据通过PCA方向投影,即通过特征向量的前面几个作用后的数据,因此这里的dst的尺寸变小了

dst = pca.project(mat);

//通过方向投影重构原始人脸图像(其本质暂时还没完全弄明白)

project_face1 = normalize(pca.backProject(dst).col(0)).reshape(1, src[0].rows);

imwrite("./result/project_face1.jpg", project_face1);

ui->face4Browser->append("project_face1.jpg");

project_face2 = normalize(pca.backProject(dst).col(6)).reshape(1, src[0].rows);

imwrite("./result/project_face2.jpg", project_face2);

ui->face5Browser->append("project_face2.jpg");

project_face3 = normalize(pca.backProject(dst).col(13)).reshape(1, src[0].rows);

imwrite("./result/project_face3.jpg", project_face3);

ui->face6Browser->append("project_face3.jpg");

}

void PCAFace::on_closeButton_clicked()

{

close();

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值