OpenCV3.3中主成分分析(Principal Components Analysis, PCA)介面簡介及使用
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);
std::vector<cv::Mat> result(images.size());
for (int i = 0; i < images.size(); ++i) {
// Demonstration of the effect of retainedVariance on the first image
cv::Mat point = pca.project(data.row(i)); // 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[i].channels(), images[i].rows); // reshape from a row vector into image shape
cv::normalize(reconstruction, reconstruction, 0, 255, cv::NORM_MINMAX, CV_8UC1);
reconstruction.copyTo(result[i]);
}
save_images(result, "E:/GitCode/NN_Test/data/pca_result_.jpg", 5);
// 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
相關文章
- 主成分分析(Principal components analysis)-最大方差解釋
- 主成分分析(PCA)簡介PCA
- 主成分分析(Principal components analysis)-最小平方誤差解釋
- 主成分分析(PCA)PCA
- PCA主成分分析(上)PCA
- 主成分分析(PCA)原理詳解PCA
- 主成分分析(PCA)原理總結PCA
- 主成分分析(PCA) C++ 實現PCAC++
- 用scikit-learn學習主成分分析(PCA)PCA
- 基於PCA(主成分分析)的人臉識別PCA
- 主成分分析(PCA)Python程式碼實現PCAPython
- 聊聊基於Alink庫的主成分分析(PCA)PCA
- 機器學習_用PCA主成分分析給資料降維機器學習PCA
- 運用sklearn進行主成分分析(PCA)程式碼實現PCA
- 【機器學習】--主成分分析PCA降維從初識到應用機器學習PCA
- 【數學】主成分分析(PCA)的詳細深度推導過程PCA
- 手把手 | 用StackOverflow訪問資料實現主成分分析(PCA)PCA
- R語言邏輯迴歸、GAM、LDA、KNN、PCA主成分分類分析預測房價及交叉驗證R語言邏輯迴歸GAMLDAKNNPCA
- 特徵向量/特徵值/協方差矩陣/相關/正交/獨立/主成分分析/PCA/特徵矩陣PCA
- opencv——PCA(主要成分分析)數學原理推導OpenCVPCA
- 主成分分析推導
- 主成分與因子分析
- 【譯】Web Components簡介Web
- 找最大數;及序列生成分析
- Flyway簡介及使用
- openvas簡介及使用
- linux環境中ab命令簡介及結果分析Linux
- Python數模筆記-Sklearn(3)主成分分析Python筆記
- Locust 簡介及安裝使用
- AWK簡介及使用例項
- maven簡介及基礎使用Maven
- 博主簡介
- LDA主題模型簡介及Python實現LDA模型Python
- 硬碟介面簡介硬碟
- 關於SQL Server中索引使用及維護簡介(zt)SQLServer索引
- 材料成分分析
- CSS中expression使用簡介CSSExpress
- svg01——svg簡介及簡單使用SVG