随着OpenCV的发展,封装了越来越多的功能,而往往这些功能不是一个函数就能完成的,实现为一组函数又会导致整个库的函数变得杂乱无章,因此常常使用一个新的对象类型来实现这个新功能。通过重载operator()来生成对象或函数子。下面主要讲述了三个新类型cv::PCA、cv::SVD和cv::RNG。
cv::PCA
主成分分析是一种降维的方法,主要是通过分析多维分布从中提取出带有最多信息量的维度子集的方法,这样,在不损失太多精度的前提下,可以扔掉较少信息的维度。
cv::PCA::PCA()
cv::PCA::PCA()
作用:默认的构造函数,简单的创建PCA对象并初始化空结构
cv::PCA::PCA(InputArray data, InputArray mean, int flags, int maxComponents=0)
作用:执行默认构造,然后立即将它的参数传递给cv::PCA::operator()
cv::PCA::operator()
cv::PCA& cv::PCA::operator()(InputArray data, InputArray mean, int flags, int maxComponents=0)
作用:生成PCA对象内部分布的模型。
参数:
参数 | 含义 | |
---|---|---|
data | 一个包含所有构成样本分布的矩阵,n采样,D维 | |
mean | 包含每一维的平均值的矩阵 | |
flags | 指定data和mean的排布方式: | cv::PCA_DATA_AS_ROW:data是n×D,mean是n×1 |
cv::PCA_DATA_AS_COL:data是D×n,mean是1×n | ||
maxComponents | 最大保留的成分(维度)数,默认情况下都保留 |
cv::PCA::project()
cv::Mat cv::PCA::project(InputArray vec) const
void cv::PCA::project(InputArray vec, OutputArray result) const
作用:将向量投影到主分量子空间。
cv::PCA::backProject()
cv::Mat cv::PCA::backProject(InputArray vec) const
void cv::PCA::backProject(InputArray vec, OutputArray result) const
作用:根据PC投影重建向量。
cv::SVD
奇异值分解(SVD)本质上是解决非方阵、病态的(不适定的)或不良矩阵的工具。在数学上,奇异值分解对于一个m×n的矩阵A的分解形式为:
其中,U是m×m的矩阵,W是m×n的对角矩阵(行和列下标不相等时设为0),V是n×n的矩阵。
cv::SVD::SVD()
cv::SVD::SVD()
作用:默认的构造函数,简单的创建SVD对象并初始化空结构
cv::SVD::SVD(InputArray A, int flags=0)
作用:执行默认构造,然后立即将它的参数传递给cv::SVD::operator()
cv::SVD::operator()
cv::SVD& cv::SVD::operator(InputArray A, int flags=0)
作用:将需要分解的矩阵传递给cv::SVD对象,矩阵A将被分为U、W和V的转置(之后记作Vt)。
值 | 含义 |
---|---|
cv::SVD::MODIFY_A | 允许在计算时改变矩阵A的值 |
cv::SVD::NO_UV | 不用显式的计算出矩阵U和Vt |
cv::SVD::FULL_UV | 不仅要计算出U和Vt,而且要让它们是全尺寸的正交方阵 |
cv::SVD::compute()
void cv::SVD::compute(InputArray A, OutputArray W, OutputArray U, OutputArray Vt, int flags)
作用:矩阵A将被分为U、W和Vt,并将结果存放在用户提供的矩阵里。
cv::SVD::solveZ()
void cv::SVD::solveZ(InputArray A, OutputArray z)b
作用:给定一个欠定的(奇异)线性系统,该函数将会尝试找出一个单位长度的解,然后放在矩阵z中。若没有找到,则返回值将是使得值最小的向量。
原理:
cv::SVD::backSubst()
void cv::SVD::backSubst(InputArray b, OutputArray x)
void cv::SVD::backSubst(InputArray W, InputArray U, InputArray Vt, InputArray b, OutputArray x)
作用:执行奇异值反向替换。
原理:形式一:
形式二:
cv::RNG
随机对象RNG用来产生随机数的伪随机序列。一旦随机数发生器创建,就会开始按需提供产生随机数的“服务”,无论是平均分布(Multiply with Carry,MWC算法)还是正态分布(Ziggurate算法)。
cv::theRNG()
cv::RNG& cv::theRNG(void)
作用:为调用它的线程返回一个默认的随机数生成器。
cv::RNG()
cv::RNG::RNG(void)
cv::RNG::RNG(uint64 state)
作用:使用默认的构造函数来创建一个RNG对象,或者传递一个64位的无符号整型数,这个数将用来作为随机数序列的种子。
cv::RNG::operator T(),其中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()
作用:重载类型转换操作符,可以把RNG对象转换成任何想要的类型。
注:当产生浮点数的时候,它们的范围始终是[0.0, 1.0)。
cv::RNG::operator()
unsigned int cv::RNG::operator()()
作用:返回一个从[0, UINT_MAX)均匀采样的随机整数。
unsigned int cv::RNG::operator()(unsigned 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)
作用:在[a, b)的范围内产生平均分布(使用MWC算法)的随机数
cv::RNG::gaussian()
double cv::RNG::gaussian(double sigma)
作用:返回从高斯分布中取样的下一个随机数。
cv::RNG::fill()
void cv::RNG::fill(InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange=false)
作用:使用特定分布随机数填充一个至多4个通道的输入矩阵。
参数 | 含义 |
---|---|
mat | 输入矩阵 |
distType | 指定分布类型。cv::RNG::UNIFORM或cv::RNG::NORMAL |
a | 均分布是指下限(含),正态分布指均值 |
b | 均分布是指上限(不含),正态分布指标准差 |
saturateRange | 是否先饱和处理,true:range[saturate(a), saturate(b)),false:saturate(range[a, b)) |