OpenCV学习心得——基础篇——OpenCV中的函数子
FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER
简介:
这一系列的学习心得第一轮将参考《学习OpenCV3》一书
操作系统版本:Ubuntu16.04(在这里博主在Linux下进行运行的)
http://www.ubuntu.org.cn/download/desktop 桌面版ubuntu16.04 下载
电子版书籍下载地址
暂无资源
参考:https://blog.csdn.net/godadream/article/details/81841419
内容:
随着OpenCV的发展,封装了越来越多的功能,而往往这些功能不是一个函数就能完成的,实现为一组函数又会导致整个库的函数变得杂乱无章,因此常常使用一个新的对象类型来实现这个新功能。通过重载operator()来生成对象或函数子。下面主要讲述了三个新类型cv::PCA、cv::SVD和cv::RNG
cv::PCA——主成分分析
函数 | 说明 |
---|---|
cv::PCA::PCA() | 默认的构造函数,简单的创建PCA对象并初始化空结构 |
cv::PCA::operator() | 生成PCA对象内部分布的模型 |
cv::PCA::project() | 将向量投影到主分量子空间 |
cv::PCA::backProject() | 根据PC投影重建向量 |
主成分分析是一种降维的方法,主要是通过分析多维分布从中提取出带有最多信息量的维度子集的方法,这样,在不损失太多精度的前提下,可以扔掉较少信息的维度。
参考:
https://blog.csdn.net/qq_25680531/article/details/81453687 主成分分析(PCA)详细讲解
https://blog.csdn.net/a8039974/article/details/81285238 PCA(主成分分析)详解(写给初学者)
cv::PCA::PCA( )
PCA::PCA(
cv::InputArray data, //一个包含所有构成样本分布的矩阵,n采样,D维
cv::InputArray mean, //包含每一维的平均值的矩阵
int flags, //向量是“数据”的行或列
int maxComponents = 0 //最大保留的成分(维度)数,默认情况下都保留
);
PCA::operator( )(
cv::InputArray data,
cv::InputArray mean,
int flags,
int maxComponents = 0
);
为PCA重载的operator( ) 生成PCA对象内部分布的模型。
cv::PCA_DATA_AS_ROW:data是n×D,mean是n×1
cv::PCA_DATA_AS_COL:data是D×n,mean是1×n
cv::Mat PCA::project( //将向量投影到主分量子空间
cv::InputArray vec
) const;
void PCA::Project(
cv::InputArray vec
cv::OutputArray reult
) const;
cv::Mat PCA::backProject( //返回结果,作为二维矩阵
cv::InputArray vec //包含来自映射后空间的输入向量
) const;
void PCA::backproject(
cv::InputArray vec
cv::OutputArray result //全尺寸“重构”矢量
) const;
cv::SVD——奇异值分解
函数 | 说明 |
---|---|
cv::SVD::SVD() | 默认的构造函数,简单的创建SVD对象并初始化空结构 |
cv::SVD::operator() | 将需要分解的矩阵传递给cv::SVD对象,矩阵A将被分为U、W和V的转置(j即Vt) |
cv::SVD::compute() | 矩阵A将被分为U、W和Vt,并将结果存放在用户提供的矩阵里。 |
cv::SVD::solveZ() | 给定一个欠定的(奇异)线性系统,该函数将会尝试找出一个单位长度的解,然后放在矩阵z中。若没有找到,则返回值将是使得值最小的向量。 |
cv::SVD::backSubst() | 执行奇异值反向替换。 |
其本质上是解决非方阵、病态的(不适定的)或不良矩阵的工具。
参考:
https://blog.csdn.net/u013108511/article/details/79016939 奇异值分解(SVD)原理
https://blog.csdn.net/lalaxumelala/article/details/83033379 SVD——奇异值分解概述
SVD::SVD();
SVD::SVD(
cv::InputArray A,
int flags = 0
);
SVD::& SVD::operator( ) (
cv::InputArray A,
int flags = 0
);
void SVD::compute(
cv::InputArray A,
cv::OutputArray W,
cv:OutputArray U,
cv::OutputArray Vt,
int flags = 0
);
void SVD::solveZ(
cv::InputArray A,
cv::OutputArray z
);
void SVD::backSubst(
cv::InputArray b,
cv::OutputArray x
);
void SVD::backSubst(
cv::InputArray W,
cv::InputArray U,
cv::InputArray Vt,
cv::InputArray b,
cv::OutputArray x,
);
cv::RNG——随机数发生器
函数 | 说明 |
---|---|
cv::theRNG() | 为调用它的线程返回一个默认的随机数生成器 |
cv::RNG() | 使用默认的构造函数来创建一个RNG对象,或者传递一个64位的无符号整型数,这个数将用来作为随机数序列的种子 |
cv::RNG::operator T() | 重载类型转换操作符,可以把RNG对象转换成任何想要的类型。 |
cv::RNG::operator() | 返回一个从[0, UINT_MAX)均匀采样的随机整数/返回一个从[0, N)均匀采样的随机整数 |
cv::RNG::uniform() | 在[a, b)的范围内产生平均分布(使用MWC算法)的随机数 |
cv::RNG::gaussian() | 返回从高斯分布中取样的下一个随机数 |
cv::RNG::fill() | 使用特定分布随机数填充一个至多4个通道的输入矩阵 |
随机对象RNG用来产生随机数的伪随机序列。一旦随机数发生器创建,就会开始按需提供产生随机数的“服务”,无论是平均分布(Multiply with Carry,MWC算法)还是正态分布(Ziggurate算法)。
cv::RNG& theRNG(void);
一般用于一个数或者是初始化一个数组
cv::RNG::RNG(void);
cv::RNG::RNG(uint64 state);
cv::RNG::operator T()
cv::RNG::operator uchar()
cv::RNG::operator schar()
cv::RNG::operator ushort()
cv::RNG::operator short int()
cv::RNG::operator int()
cv::RNG::operator unsigned()
cv::RNG::operator float()
cv::RNG::operator double()
cv::RNG::operator( )
unsigned int cv::RNG::operator()(); //返回一个从[0, UINT_MAX)均匀采样的随机整数
unsigned int cv::RNG::operator()(ubsigned int N); //返回一个从[0, N)均匀采样的随机整数
cv::RNG::uniform( )
int cv::RNG::uniform( int a, int b);
float cv::RNG::uniform(float a,float b);
double cv::RNG::uniform(double a, double b);
cv::RNG::gaussian( )
double cv::RNG::gaussian( double sigma); //高斯数,零均值
cv::RNG::fill( )
void cv::RNG::fill(
InputOutputArray mat, //输入数组,值将被覆盖
int distType, //分布类型(高斯分布或均匀分布)
InputArray a, //最小(均匀)或平均(高斯)
InputArray b //最大(均匀)或标准偏差(高斯)
);
cv::RNG::fill()
void cv::RNG::fill(
InputOutputArray mat, //输入矩阵
int distType, //指定分布类型。cv::RNG::UNIFORM或cv::RNG::NORMAL
InputArray a, //均分布是指下限(含),正态分布指均值
InputArray b, //均分布是指上限(不含),正态分布指标准差
bool saturateRange=false //是否先饱和处理,true:range[saturate(a), saturate(b)),false:saturate(range[a, b))
);