文章目录
- 一、标准差,协方差
- 二、特征值、特征向量
- 演示
一、标准差,协方差
矩阵数据处理理论:
计算协方差示例图:
二、特征值、特征向量
有矩阵 ,其特征值与特征向量定义:
( 特征值
, 特征向量
)
特征值为零时,矩阵不可逆:
计算演示图:
头文件 FaceRecognize.h
:
#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
class FaceRecognize {
public:
void meanStdDev_demo(Mat& image);
};
主函数main.cpp
#include "FaceRecognize.h"
int main(int argc, char**argv) {
const char* input_path = "D:/Desktop/222222.png";
Mat image = imread(input_path);
if (image.empty()) {
printf("Read image failed!");
exit(-1);
}
FaceRecognize face_recognize;
face_recognize.meanStdDev_demo(image);
return 0;
}
演示
#include "FaceRecognize.h"
void FaceRecognize::meanStdDev_demo(Mat& image) {
Mat means_dst, stddev_dst;
// 计算矩阵:平均值,标准差
meanStdDev(image, means_dst, stddev_dst);
printf("means_dst rows : %d, %d\n", means_dst.rows, means_dst.cols);
printf("stddev_dst rows : %d, %d\n", stddev_dst.rows, stddev_dst.cols);
for (int i = 0; i < means_dst.rows; i++){
printf("means_dst [%d] : %f\n", i, means_dst.at<double>(i));
printf("stddev_dst[%d] : %f\n", i, stddev_dst.at<double>(i));
}
// 计算矩阵:协方差
Mat sample = (Mat_<double>(5, 3) <<
90, 60, 90,
90, 90, 30,
60, 60, 60,
60, 60, 90,
30, 30, 30
);
Mat cov, mu;
calcCovarMatrix(sample, cov, mu, COVAR_NORMAL | COVAR_ROWS);
cout << "cov:\n" << cov / 5 << endl;
cout << "mu:\n" << mu << endl;
// 计算矩阵:特征值,特征向量
Mat eigenVal, eigenVec;
Mat sample2 = (Mat_<double>(2, 2) << 2, 4, 4, 2);
cv::eigen(sample2, eigenVal, eigenVec);
for (size_t i = 0; i < eigenVal.rows; i++){
cout << "eigenVal: " << eigenVal.at<double>(i) << endl;
}
cout << "\n eigenVec:\n" << eigenVec << endl;
}
//==============输出=================
// means_dst rows : 3, 1
// stddev_dst rows : 3, 1
// means_dst [0] : 140.189326
// stddev_dst[0] : 110.839304
// means_dst [1] : 50.316178
// stddev_dst[1] : 69.701243
// means_dst [2] : 52.092850
// stddev_dst[2] : 77.952390
// cov:
// [504, 360, 180;
// 360, 360, 0;
// 180, 0, 720]
// mu:
// [66, 60, 60]
// eigenVal: 6
// eigenVal: -2
//
// eigenVec:
// [0.7071067811865475, 0.7071067811865475;
// 0.7071067811865475, -0.7071067811865475]