OpenCV中的函數子

隨着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的分解形式爲:

A=UW V^T

其中,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)。

flags的可取值
含義
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中。若沒有找到,則返回值將是使得值最小的向量。

原理:\vec{z}=argmin_{\vec{x}:\left \| \vec{x} \right \|=1}\left \| A\cdot \vec{x} \right \|

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)

作用:執行奇異值反向替換。

原理:形式一:(UWV^T)\cdot \vec{x}=\vec{b}

           形式二:\vec{x}=V_t^T\cdot diag(W)^{-1}\cdot U^T\cdot \vec{b}\sim A^{-1}\cdot \vec{b}

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章