隨着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)) |