OpenCV之人脸识别(一) 均值方差协方差及协方差矩阵

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanghuangjin/article/details/81623851
Mat像素统计基础
    计算N维数据的平均值
    方差
    协方差

这里写图片描述

计算方差与协方差矩阵:
这里写图片描述
这里写图片描述

代码

#include "../common/common.hpp"

void main(int argc, char ** argv)
{
    Mat src = imread(getCVImagesPath("images/test.png"));
    imshow("src8-2", src);

    Mat means, stddev; // 均值,方差
    /*
        void meanStdDev( // 计算均值和标准方差(偏差)
            InputArray src, // 输入矩阵
            OutputArray mean, // 输出参数,均值
            OutputArray stddev, // 输出参数,标准差(方差)
            InputArray mask=noArray() 
        );
    */
    meanStdDev(src, means, stddev);
    // means rows=3, cols=1, depth=6, type=6   src是3通道的,所以计算出来的rows=3
    cout << "means rows=" << means.rows << ", cols=" << means.cols << ", depth=" << means.depth() << ", type=" << means.type() << endl;
    // stddev rows=3, cols=1, depth=6, type=6    CV_64F
    cout << "stddev rows=" << stddev.rows << ", cols=" << stddev.cols << ", depth=" << stddev.depth() << ", type=" << stddev.type() << endl;
    for (size_t row = 0; row < means.rows; row++)
    {
        // 当方差大于均值时,表示图像的像素值分差明显,可以用均值作为阈值二值化
        // 当图像的像素值一致的时候,方差为0
        cout << "means " << row << ", " << means.at<double>(row) << endl;
        cout << "stddev " << row << ", " << stddev.at<double>(row) << endl;
    }

    // 5*3 矩阵
    Mat samples = (Mat_<double>(5, 3) << 90,60,90, 90,90,30, 60,60,60, 60,60,90, 30,30,30); // <<给Mat赋值方式为一行一行的赋,不是一列一列
    Mat cov, mu; // 协方差矩阵,各维度均值矩阵
    /*
        void calcCovarMatrix( // 计算协方差矩阵
            InputArray samples, // 输入矩阵
            OutputArray covar, // 输出参数,协方差矩阵
            InputOutputArray mean, // 输出参数,均值矩阵
            int flags, // CV_COVAR_NORMAL  表示 flag for cvCalcCovarMatrix, [v1-avg, v2-avg,...] * transpose([v1-avg,v2-avg,...])
                       // CV_COVAR_ROWS    表示 flag for cvCalcCovarMatrix, all the input vectors are stored in a single matrix, as its rows
                       // CV_COVAR_COLS    表示 flag for cvCalcCovarMatrix, all the input vectors are stored in a single matrix, as its columns
                       // 其他参数参看注释
            int ctype = CV_64F 
        );
    */
    calcCovarMatrix(samples, cov, mu, CV_COVAR_NORMAL | CV_COVAR_ROWS);
    // cov rows=3, cols=3, depth=6, type=6
    cout << "cov rows=" << cov.rows << ", cols=" << cov.cols << ", depth=" << cov.depth() << ", type=" << cov.type() << endl;
    // mu rows=1, cols=3, depth=6, type=6
    cout << "mu rows=" << mu.rows << ", cols=" << mu.cols << ", depth=" << mu.depth() << ", type=" << mu.type() << endl;
    /*
        [2520, 1800, 900;
         1800, 1800, 0;
         900,  0,    3600]
    */
    cout << cov << endl;
    /*
        [504, 360, 180;
         360, 360, 0;
         180, 0,   720]
    */
    cout << cov/5 << endl;
    cout << mu << endl; // [66, 60, 60]

    waitKey(0);
}

效果图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/81623851