PCA算法:从一组照片中获取特征脸(特征向量)

2024-05-30 05:58

本文主要是介绍PCA算法:从一组照片中获取特征脸(特征向量),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍了对一组照片进行PCA处理的过程和结果。本文使用OpenCV的PCA处理函数,参考了夏天的味道的博客opencv pca。本文使用的照片来源于YelaFaces(直接Baidu就能找到在CSDN上的下载链接,就不上传了)。

一、操作步骤

PCA处理的基本步骤为:

1、获取m个样本,每个样本有n个特征。

2、每个样本作为一行,构成m*n的举证A。

3、将矩阵转置再乘以自己得到C=A(t)*A。

4、求出矩阵C的特征值及特征向量,特征向量即为特征脸。

二、代码及解释

#include "stdafx.h"
#include <string>
#include <opencv2\opencv.hpp> 
using namespace std;
using namespace cv;int _tmain(int argc, _TCHAR* argv[])
{//获取了mean_faceint num_sample = 38;int norm_row = 64, norm_col = 56;int num;Mat imgs = loadImages(num);Mat mean_face = Mat(norm_row, norm_col, CV_8UC1);vector<int> mean_face_total;mean_face_total.resize(norm_row * norm_col);for (int i = 0; i < num; i++){for (int j = 0; j < norm_row * norm_col; j++){mean_face_total.at(j) += imgs.at<uchar>(i * norm_row * norm_col + j);//eigen_face_total[j] += imgs.at<uchar>(i * 192 * 168 + j);}}for (int j = 0; j < norm_row * norm_col; j++){mean_face.at<uchar>(j) = (uchar)(mean_face_total.at(j) / num);}imwrite("C:/Users/dhj555/Desktop/YelaFaces/eigen_face/0001.jpg", mean_face);imshow("eigen_face", mean_face);//1、初始化数据CvMat* pData = cvCreateMat(num_sample, norm_row * norm_col, CV_32FC1);CvMat* pMean = cvCreateMat(1, norm_row * norm_col, CV_32FC1);//每个数标志一个特征值CvMat* pEigVals = cvCreateMat(1, min(num_sample, norm_row * norm_col), CV_32FC1);//每行表示一个特征向量CvMat* pEigVecs = cvCreateMat(min(num_sample, norm_row * norm_col), norm_row * norm_col, CV_32FC1);for (int i = 0; i < num_sample; i++){for (int j = 0; j < norm_row * norm_col; j++)cvmSet(pData, i, j, imgs.at<uchar>(i * norm_row * norm_col + j));}//2、PCA处理cvCalcPCA(pData, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW);//3、选出前P个特征向量(主成份),然后投影,结果保存在pResult中,pResult中包含了P个系数//CvMat* pResult = cvCreateMat(num_sample, 20, CV_32FC1);//cvProjectPCA(pData, pMean, pEigVecs, pResult);//4、重构, 结果保存在pRecon中//CvMat* pRecon = cvCreateMat(num_sample, norm_row*norm_col, CV_32FC1);//cvBackProjectPCA(pResult, pMean, pEigVecs, pRecon);//5、显示重构的图像//Mat mRecon = Mat(pRecon);//4、显示与保存特征向量for (int i = 0; i < min(num_sample, norm_row * norm_col); i++){float min = LLONG_MAX, max = LLONG_MIN, span = 0.0;for (int index = 0; index < norm_row*norm_col; index++){float d = cvmGet(pEigVecs, i, index);if (d>max)max = d;if (d < min)min = d;}span = max - min;Mat eigen_face = Mat(norm_row, norm_col, CV_8UC1);for (int index = 0; index < norm_row*norm_col; index++){float d = cvmGet(pEigVecs, i, index);eigen_face.at<uchar>(index) = (d - min) / span * 255.0;}char buffer[128];sprintf_s(buffer, "C:/Users/dhj555/Desktop/YelaFaces/eigen_face/001/1-000%d.jpg", i);string imgPath(buffer);imshow(imgPath, eigen_face);printf("%d st:\t%f\n", i, cvmGet(pEigVals, 0, i));imwrite(imgPath, eigen_face);}
}
1、第9至16行:声明变量。
2、第18至32行:读取文件到imgs中,总共读取了38张人脸,并将每张人脸缩放为64*56大小,所以imgs为38行,64*56列的矩阵。
3、第34至40行:声明了PCA计算相关的矩阵,具体说明见代码注释。
4、第42至46行:将imgs中的数据写入pData中,以用于PCA计算。
5、第49行:调用OpenCV的函数计算特征值及特征向量。
6、第64至88行:根据特征值导出特征脸并保存显示。

三、实验结果

求出的特征值及相应的特征脸(至上传了前11个,总共38个,可以在这里 下载查看所有的):
特征值特征脸
0 st:   1512882.000000
1 st:   316433.875000
2 st:   268737.531250
3 st:   248890.359375
4 st:   177919.671875
5 st:   139744.718750
6 st:   112001.937500
7 st:   108768.914063
8 st:   85501.773438
9 st:   72161.312500
10 st:  67518.437500
11 st:  62258.648438


 

这篇关于PCA算法:从一组照片中获取特征脸(特征向量)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1015753

相关文章

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.