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

401人阅读 评论(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 

查看评论

Opencv学习笔记-----PCA原理及OpenCV实现

一、介绍            PCA(principal component analysis)就是主分量分析,是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示...
  • ycj9090900
  • ycj9090900
  • 2016-11-26 00:47:13
  • 2739

PCA降维(Opencv,C++)

Opencv , PCA降维
  • zmdsjtu
  • zmdsjtu
  • 2017-09-11 20:55:43
  • 674

PCA实现步骤及其与opencv中PCA实现方式的对比

PCA,也就是PrincipalComponents Analysis,主成份分析,是个很优秀的算法,按照书上的说法:...
  • computerme
  • computerme
  • 2014-06-12 21:24:37
  • 3649

Machine Leanring-Principal Component Analysis(PCA)

Principal Component Analysis 方差:数据与平均数之差平方和的平均数。更多详见 Principal Component Analysis(PCA)是最常用的线性降维方法,它...
  • dingchenxixi
  • dingchenxixi
  • 2016-06-12 09:01:17
  • 1987

PCA主成分分析(Principal Component Analysis)

PCA是基本的线性降维方法,同时也是一种监督学习降维方法。PCA是希望降维之后,尽量保留原始数据的方差结构,所以我们需要投影方向a使得投影之后数据的方差最大化。 1. 求解 PCA是通过求...
  • Daniel_djf
  • Daniel_djf
  • 2014-12-25 10:32:58
  • 2293

Principal components analysis(PCA) 主成分分析

本文主要参考资料: CS229 lecture notes by Andrew Ng UFLDL主成分分析 by Andrew Ng 《机器学习实战》第13章“使用PCA来简化数据” ...
  • bcj296050240
  • bcj296050240
  • 2017-02-19 16:06:14
  • 797

在Python中一步一步实现Principal Component Analysis(PCA)

主成分分析的主要目的是分析数据以识别模式和查找模式,以最小的信息丢失来降低数据集的维度。主成分分析的期望结果是将一个特征空间(包括n个d维的样本的数据集)映射到一个较小的子空间上来较好的表示数据。较多...
  • u010798503
  • u010798503
  • 2017-04-12 20:24:45
  • 459

PCA-Principal Components Analysis数学原理

PCA-Principal Components Analysis 最近自学的重点是特征工程,首当其冲的当然是PCA,可是看了好几篇国内搜索靠前的博客大部分都是做法而不是原理,为什么协方差矩阵的特征值...
  • yobobobo
  • yobobobo
  • 2015-08-16 22:25:59
  • 3724

主成分分析PCA(Principal Component Analysis)介绍

很久之前,有一次做人脸识别的时候用过PCA,大概记得是降维用的,然后前段时间用到LDA的时候顺带看到PCA才发现忘的差不多了,干脆把一些资料整理一下吧。 一.K-L变换 说PCA的...
  • kingskyleader
  • kingskyleader
  • 2012-07-10 23:40:56
  • 15691

特征降维-PCA(Principal Component Analysis)

在进行图像的特征提取的过程中,提取的特征维数太多经常会导致特征匹配时过于复杂,消耗系统资源,不得不采用特征降维的方法。所谓特征降维,即采用一个低纬度的特征来表示高纬度。特征降维一般有两类方法:特征选择...
  • xl890727
  • xl890727
  • 2013-11-23 11:56:25
  • 105924
    个人资料
    持之以恒
    等级:
    访问量: 388万+
    积分: 3万+
    排名: 130
    最新评论
    文章存档