一、操作对象
随着OpenCV库的发展,封装复杂功能的新对象越来越普遍地引进,这些功能不是单一的函数能够完成的,但是将它们实现为一组函数又会导致整个库的函数变得太杂乱。
因此,尝尝使用一个相关联的新的对象类型来表示一个新功能,这个对象类型可以看做是一个完成这个功能的“机器”,这些机器中的大多数都有一个重载的operator(),使其成为函数对象或者仿函数。如果这种编程习惯不太熟悉,一个重要的思想就是,和通常的函数不一样,函数对象是已经创建好的,并且能够在其内部维护状态信息。因此,它们能够和任何需要的数据或者配置一起被创建,并且它们被“要求”通过常规的成员函数或者自身作为函数被调用来提供服务。
1、主成分分析(cv:: PCA)
主成分分析,如下图所示,是一个分析多维分布并且从中提取带有最多信息量的维度子集的方法。在OpenCV库里有一个互相矛盾的习惯:使用重载的operator()来载入配置和使用一个成员来提供对象的基本服务这个习惯通常来说不是很标准,但是OpenCV库中很常见。由PCA计算出的维度并不一定是分布规律最初指定的基础维度。事实上,PCA的一个重要功能就是能够按照轴的重要性排序来生成新的基础维度。这些基向量可以被证明是整体分布协方差矩阵的特征向量,相应的特征值就是那个维度的分布范围。
图解:(A)使用正态分布逼近输入数据。(B)映射到上述逼近的协方差的特征向量所构成的空间中。(C)过KLT映射到只由最“有用”的特征向量构成的空间,加上一个新的数据点(白色方块)通过cv::PCA::project()映射到降维空间中,同样数据点通过cv::PCA::backProject()映射回原空间中(黑色方块)
一旦给定一个分布,PCA对象就可以计算并记录下它的基准,这个基准特征值的特征向量带有该分布的大量信息。因此,可以对拥有该分布的维度进行简化,这种降维的方法叫做KLT。
1.1 cv::PCA::PCA()
PCA::PCA();
PCA::PCA(
cv::InputArray data, // Data, as rows or cols in 2d array
cv::InputArray mean, // average, if known, 1-by-n or n-by-1
int flags, // Are vectors rows or cols of 'data'
int maxComponents = 0 // Max dimensions to retain
);
PCA对象有一个默认的构造函数cv::PCA(),他简单地创建PCA对象并且初始化空结构。第二种形式执行默认的构造操作,然后立即将它的参数传递给PCA::operator()
1.2 cv::PCA::operator()()
PCA::operator()(
cv::InputArray data, // Data, as rows or cols in 2d array
cv::InputArray mean, // average, if known, 1-by-n or n-by-1
int flags, // Are vectors rows or cols of 'data'
int maxComponents = 0 // Max dimensions to retain
);
此功能即为仿函数操作。具体的实现和完成的功能可参考相关文档。
1.3 cv::PCA::project()
cv::Mat PCA::project( // Return results, as a 2d matrix
cv::InputArray vec // points to project, rows or cols, 2d
) const;
void PCA::project(
cv::InputArray vec // points to project, rows or cols, 2d
cv::OutputArray result // Result of projection, reduced space
) const;
1.4 cv::PCA::backProject()
cv::Mat PCA::backProject( // Return results, as a 2d matrix
cv::InputArray vec // Result of projection, reduced space
} const;
void PCA::backProject(
cv::InputArray vec // Result of projection, reduced space
cv::OutputArray result // "reconstructed" vectors, full dimension
) const;
2、奇异值分解sv::SVD
过,感兴趣者自行百度
3、随机数发生器cv::RNG
一个随机数对象(RNG)用来产生随机数的伪随机序列。这样做的好处是你可以方便地得到多重伪随机数流。
3.1 cv::RNG()
cv::RNG& theRNG( void ); // Return a random number generator
cv::RNG::RNG( void );
cv::RNG::RNG( uint64 state ); // create using the seed 'state'
3.2 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();
unsigned int cv::RNG::operator()(); // Return random value from 0-UINT_MAX
unsigned int cv::RNG::operator()( unsigned int N ); // Return value from 0-(N-1)
3.3 cv::RNG::uniform()
int cv::RNG::uniform( int a, int b ); // Return value from a-(b-1)
float cv::RNG::uniform( float a, float b ); // Return value in range [a,b)
double cv::RNG::uniform( double a, double b ); // Return value in range [a,b)
3.4 cv::RNG::gaussian()
double cv::RNG::gaussian( double sigma ); // Gaussian number, zero mean,std-dev='sigma'
3.5 cv::RNG::fill()
void cv::RNG::fill(
InputOutputArray mat, // Input array, values will be overwritten
int distType, // Type of distribution (Gaussian or uniform)
InputArray a, // min (uniform) or mean (Gaussian)
InputArray b // max (uniform) or std-deviation (Gaussian)
);
二、小结
在这一章里,我们介绍了仿函数的概念。