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获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja