关闭

OpenCV3.3中主成分分析(Principal Components Analysis, PCA)接口简介及使用

110人阅读 评论(0) 收藏 举报
分类:

OpenCV3.3中给出了主成分分析(Principal Components Analysis, PCA)的实现,即cv::PCA类,类的声明在include/opencv2/core.hpp文件中,实现在modules/core/src/pca.cpp文件中,其中:

(1)、cv::PCA::PCA:构造函数;

(2)、cv::PCA::operator():函数调用运算符;

(3)、cv::PCA::project:将输入数据投影到PCA主成分空间;

(4)、cv::PCA::backProject:重建原始数据;

(5)、cv::PCA::write:将特征值、特征向量、均值写入指定的文件;

(6)、cv::PCA::read:从指定文件读入特征值、特征向量、均值;

(7)、cv::PCA::eigenvectors:协方差矩阵的特征向量;

(8)、cv::PCA::eigenvalues:协方差矩阵的特征值;

(9)、cv::PCA::mean:均值。

关于PCA的介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/78977202 

以下是使用ORL Faces Database作为测试图像。关于ORL Faces Database的介绍可以参考: http://blog.csdn.net/fengbingchun/article/details/79008891 

测试代码如下:

#include "opencv.hpp"
#include <string>
#include <vector>
#include <memory>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <opencv2/ml.hpp>
#include "common.hpp"

////////////////////////////// PCA(Principal Component Analysis) ///////////////////////
int test_opencv_pca()
{
	// reference: opencv-3.3.0/samples/cpp/pca.cpp
	const std::string image_path{ "E:/GitCode/NN_Test/data/database/ORL_Faces/" };
	const std::string image_name{ "1.pgm" };

	std::vector<cv::Mat> images;
	for (int i = 1; i <= 15; ++i) {
		std::string name = image_path + "s" + std::to_string(i) + "/" + image_name;
		cv::Mat mat = cv::imread(name, 0);
		if (!mat.data) {
			fprintf(stderr, "read image fail: %s\n", name.c_str());
			return -1;
		}

		images.emplace_back(mat);
	}

	cv::Mat data(images.size(), images[0].rows * images[0].cols, CV_32FC1);
	for (int i = 0; i < images.size(); ++i) {
		cv::Mat image_row = images[i].clone().reshape(1, 1);
		cv::Mat row_i = data.row(i);
		image_row.convertTo(row_i, CV_32F);
	}

	cv::PCA pca(data, cv::Mat(), cv::PCA::DATA_AS_ROW, 0.95f);

	// Demonstration of the effect of retainedVariance on the first image
	cv::Mat point = pca.project(data.row(0)); // project into the eigenspace, thus the image becomes a "point"
	cv::Mat reconstruction = pca.backProject(point); // re-create the image from the "point"
	reconstruction = reconstruction.reshape(images[0].channels(), images[0].rows); // reshape from a row vector into image shape
	cv::normalize(reconstruction, reconstruction, 0, 255, cv::NORM_MINMAX, CV_8UC1);

	// save file
	const std::string save_file{ "E:/GitCode/NN_Test/data/pca.xml" }; // .xml, .yaml, .jsons
	cv::FileStorage fs(save_file, cv::FileStorage::WRITE);
	pca.write(fs);
	fs.release();

	// read file
	const std::string& read_file = save_file;
	cv::FileStorage fs2(read_file, cv::FileStorage::READ);
	cv::PCA pca2;
	pca2.read(fs2.root());
	fs2.release();

	return 0;
}

GitHub: https://github.com/fengbingchun/NN_Test 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

斯坦福大学机器学习——主成份分析(Principal Components Analysis)

主成份分析就是求出原始数据矩阵的协方差矩阵对应的特征值和特征向量,对特征值进行由大而小的排序,再根据特征值对应的特征向量进行线性变换,得到新的向量(新的向量间相互正交)。通过设定阈值可以用低维的新向量...
  • linkin1005
  • linkin1005
  • 2014-12-26 14:28
  • 4124

PCA(Principal Component Analysis)主成分分析数学原理

感谢原文作者,转载收藏来学习。原文地址http://blog.codinglabs.org/articles/pca-tutorial.html PCA(Principal Componen...
  • study_000
  • study_000
  • 2017-04-07 10:20
  • 394

主成分分析(Principal Component Analysis,PCA)是什么作用?

主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。在实际课题...
  • caimouse
  • caimouse
  • 2017-03-06 20:36
  • 837

PCA--主成分分析(Principal components analysis)-最大方差解释

1. 问题      真实的训练数据总是存在各种各样的问题: 1、 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013-03-25 18:31
  • 3459

统计学习方法-主成分分析(Principal Component Analysis ,PCA )

主成分分析 ( Principal Component Analysis , PCA )是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。计算...
  • u010140338
  • u010140338
  • 2013-09-27 10:48
  • 3003

机器学习:Principal components analysis (主分量分析)

Principal components analysis 这一讲,我们简单介绍Principal Components Analysis(PCA),这个方法可以用来确定特征空间的子空间,用一种更加...
  • shinian1987
  • shinian1987
  • 2016-05-11 08:43
  • 7420

解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程~

KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实...
  • wsj998689aa
  • wsj998689aa
  • 2014-10-23 15:44
  • 22028

机器学习(十七)主成分分析(Principle Component Analysis)

主成分分析想法来源:数据压缩、可视化PCA:主成分分析。目的就是把有意义的样本点数据适当地降维表达。如果是降到3维或者2维就可以可视化表达了。这其中,针对常用的样本点来说,肯定是有数据损失的。问题是如...
  • lonelyrains
  • lonelyrains
  • 2015-11-11 18:25
  • 2906

利用 主成分分析(PCA) 降维 个人理解

特征值分解:从线性空间的角度看,在一个定义了内积的线性空间里,对一个N阶对称方阵进行特征分解,就是产生了该空间的N个标准正交基,然后把矩阵投影到这N个基上。N个特征向量就是N个标准正交基,而特征值的模...
  • damant
  • damant
  • 2016-03-23 14:02
  • 2031

PCA (主成分分析)详解 (写给初学者)

学习图像处理,无疑会涉及到降维的操作,而PCA是常用的降维算法,既然经常用到,所以需要抠明白才行啊~~       PCA(PrincipalComponents Analysis)即主...
  • wz125
  • wz125
  • 2016-12-15 00:08
  • 2561
    个人资料
    • 访问:3526770次
    • 积分:35040
    • 等级:
    • 排名:第143名
    • 原创:515篇
    • 转载:140篇
    • 译文:0篇
    • 评论:1896条
    最新评论