學習OpenCV3 Mat類詳解

Mat::Mat

各種Mat構造函數。

C++: Mat::Mat()

C++: Mat::Mat(int rows, int cols, int type)

C++: Mat::Mat(Size size, int type)

C++: Mat::Mat(int rows, int cols, int type,const Scalar& s)

C++: Mat::Mat(Size size, int type, constScalar& s)

C++: Mat::Mat(const Mat& m)

C++: Mat::Mat(int rows, int cols, int type,void* data, size_t step=AUTO_STEP)

C++: Mat::Mat(Size size, int type, void*data, size_t step=AUTO_STEP)

C++: Mat::Mat(const Mat& m, constRange& rowRange, const Range& colRange)

C++: Mat::Mat(const Mat& m, constRect& roi)

C++: Mat::Mat(const CvMat* m, boolcopyData=false)

C++: Mat::Mat(const IplImage* img, boolcopyData=false)

C++: templateexplicit Mat::Mat(const Vec& vec, bool copyData=true)

C++: template explicit Mat::Mat(const Matx& vec, bool copyData=true)

C++: template explicitMat::Mat(const vector& vec, bool copyData=false)

C++: Mat::Mat(const MatExpr& expr)

C++: Mat::Mat(int ndims, const int* sizes,int type)

C++: Mat::Mat(int ndims, const int* sizes,int type, const Scalar& s)

C++: Mat::Mat(int ndims, const int* sizes,int type, void* data, const size_t* steps=0)

C++: Mat::Mat(const Mat& m, constRange* ranges)

        

 參數

          ndims– 數組的維數.

rows – 2維數組中行行數

cols – Number of columnsin a 2D array.

size – 2維數組的尺寸Size(cols, rows) .在Size()構造函數中行數和列數在次序上剛好反轉過來了。

sizes–指定 n 維數組形狀的整數數組。

type–數組的類型。使用 CV_8UC1,… …,創建 1-4 通道的矩陣,CV_64FC4 或CV_8UC(n),… …,CV_64FC(n)可以創建多通道 (高達CV_MAX_CN 通道)矩陣。

s–一個可選的初始化每個矩陣元素的參數。要在矩陣建成後將所有元素設置爲特定值可以用Mat的賦值運算符Mat:operator=(constScala& value)。

data–指向用戶數據的指針。矩陣構造函數傳入data和step參數不分配矩陣數據。相反,它們只是初始化矩陣頭指向指定的數據,這意味着沒有數據的複製。此操作是很高效的,可以用來處理使用OpenCV 函數的外部數據。外部數據不會自動釋放,所以你應該小心處理它。

step–每個矩陣行佔用的字節數。如果任何值應包括每行末尾的填充字節。如果缺少此參數(設置爲AUTO_STEP),假定沒有填充和實際的步長用cols*elemSize()計算。請參閱Mat::elemSize()。

steps–多維數組(最後一步始終設置爲元素大小) 的情況下的 ndims-1個步長的數組。如果沒有指定的話,該矩陣假定爲連續。

m–分配給構造出來的矩陣的陣列(作爲一個整體或部分)。這些構造函數沒有複製數據。相反,指向m 的數據或它的子數組的頭被構造並被關聯到m上。引用計數器中無論如何都將遞增。所以,當您修改矩陣的時候,自然而然就使用了這種構造函數,您還修改m 中的對應元素。如果你想要獨立的子數組的副本,請使用Mat::clone()。

img –指向老版本的 IplImage圖像結構的指針。默認情況下,原始圖像和新矩陣之間共享數據。但當copyData 被設置時,完整的圖像數據副本就創建起來了。

vec–矩陣的元素構成的STL 向量。矩陣可以取出單獨一列並且該列上的行數和矢量元素的數目相同。矩陣的類型匹配的向量元素的類型。構造函數可以處理任意的有正確聲明的DataType類型。這意味着矢量元素不支持的混合型結構,它們必須是數據(numbers)原始數字或單型數值元組。對應的構造函數是顯式的。由於STL 向量不會自動轉換爲Mat實例,您應顯式編寫 Mat(vec)。除非您將數據複製到矩陣 (copyData = true),沒有新的元素被添加到向量中,因爲這樣可能會造成矢量數據重新分配,並且因此使得矩陣的數據指針無效。

copyData –指定STL 向量或舊型 CvMat 或 IplImage是應複製到 (true)新構造的矩陣中 還是 (false) 與之共享基礎數據的標誌,複製數據時,使用Mat引用計數機制管理所分配的緩衝區。雖然數據共享的引用計數爲NULL,但是分配數據必須在矩陣被析構之後纔可以釋放。

rowRange – m 的行數的取值範圍。正常情況下,範圍開始端具有包容性和範圍結束端是獨佔的。使用Range::all() 來取所有的行。

colRange –m 列數的取值範圍。使用Range::all() 來取所有的列。

ranges –表示M沿每個維度選定的區域的數組。

expr – 矩陣表達式。請參見矩陣表達式。

以上這些都是Mat形成一個矩陣的各類構造函數。如輸出數據的自動分配中所提到的,往往默認構造函數就足夠了,不同的矩陣可以由OpenCV 函數來分配數據空間。構造的矩陣可以進一步分配給另一個矩陣或矩陣表達或通過Mat::create()獲配。在前一種情況,舊的內容是間接引用的。


Mat::~Mat

Mat的析構函數。

C++: Mat::~Mat()

析構函數調用Mat::release()。

Mat::operator =

提供矩陣賦值操作。

C++: Mat& Mat::operator=(const Mat& m)

C++: Mat& Mat::operator=(const MatExpr_Base& expr)

C++: Mat& Mat::operator=(const Scalar& s)

參數:

m – 被賦值的右側的矩陣。 矩陣的賦值是一個複雜度爲O(1) 的操作。 這就意味着沒有數據段複製並且有數量的遞增兩矩陣將使用同一引用計數器。在給矩陣賦新數據之前先由Mat::release()釋放引用。

expr –被賦值的矩陣表達式對象。 作爲第一種賦值方式的逆操作第二種形式可以被重新用到具有適當大小和尺寸的已分配空間的矩陣上以適應表達式的結果。矩陣表達式擴展得到的實函數將自動處理這個分配過程。例如:

C=A+B 擴展成add(A, B, C) , andadd() 要當心C重新分配數據的操作。.

s – 標量賦值給每一個矩陣元,矩陣的大小和類型將不會改變。有現成的賦值運算符。由於他們各不相同請閱讀運算符參數說明。

Mat::operator MatExpr

提供一種Mat-to-MatExpr轉換運算符

C++: Mat::operator MatExpr_() const

轉換運算符不能顯示調用而是由矩陣表達式引擎(Matrix Expression engine)內部調用The cast operator should not be called explicitly. It is used internally by the Matrix Expressions engine.

Mat::row

創建一個指定行數的矩陣頭。.

C++: Mat Mat::row(int i) const

參數:

i  一個0基的行索引.

該方法創建一個具有指定了行數的新矩陣頭的矩陣並返回它。這是一個複雜度爲O(1) 的操作,無須考慮矩陣的尺寸。新矩陣和原矩陣共享一份基礎數據。這是一個典型基本矩陣處理操作的例子, axpy是LU和許多其它算法都使用的一個函數

inline void matrix_axpy(Mat& A, int i, int j, double alpha)

{

A.row(i) += A.row(j)*alpha;

}

Note在當前實現中,下面的代碼不會無法按預期的效果工作:

Mat A ;

...

A.row(i) = A.row(j) ;/ /不起作用

發生這種情況是因爲 A.row(i) 形成臨時矩陣頭進一步分配給另一個矩陣頭。請記住,每個操作複雜度爲O(1),即沒有複製任何數據。因此,如果你預期第 j行被複制到第 i行,那麼上述賦值不成立。要做到這一點,應該把這種簡單的賦值轉換到表達式中或使用 Mat::copyTo() 方法:

Mat A ;

...

/ / 可行,但看上去有點目的不明確。

A.row(i) = A.row(j) + 0;

/ / 這是有點兒長,但這是推薦的方法。

A.row(j).copyTo(A.row(i)) ;

Mat::col

創建一個具有指定了矩陣頭中列數這個參數的矩陣

C++: Mat Mat::col(int j) const

參數:

j –一個0基(從0開始)的列索引

該方法創建一個具有指定了矩陣頭中列數這個參數的新矩陣並作爲函數返回值。這是一種複雜度爲O(1)的操作,不用考慮矩陣的尺寸大小。新矩陣和原始矩陣共享一份基礎數據。參看Mat::row()說明信息。

Mat::rowRange

爲指定的行span創建一個新的矩陣頭。

C++: Mat Mat::rowRange(int startrow, int endrow) const

C++: Mat Mat::rowRange(const Range& r) const

參數:

startrow – 一個包容性的0基(從0開始)的行span起始索引.。

endrow – 一個0基的獨佔性的行span.終止索引。

r – Range 結構包含着起始和終止的索引值。該方法給矩陣指定的行span創建了新的頭。 與Mat::row() 和 Mat::col()相類似這是一個複雜度爲O(1)的操作。

Mat::colRange

爲指定的行span創建一個矩陣頭。

C++: Mat Mat::colRange(int startcol, int endcol) const

C++: Mat Mat::colRange(const Range& r) const

參數:

startcol – 一個包容性的0基(從0開始)的span列起始索引。

endcol –一個0基的獨佔性的列span.終止索引。

r –Range 結構包含着起始和終止的索引值。該方法給矩陣指定的列span創建了新的頭。 與Mat::row() 和 Mat::col()相類似這是一個複雜度爲O(1)的操作。

Mat::diag

提取或創建矩陣對角線。

C++: Mat Mat::diag(int d) const

C++: static Mat Mat::diag(const Mat& matD)

參數:

d – 對角線的索引值,可以是以下的值:

– d=0 是主對角線

– d>0表示下半部的對角線。例如:d=1對角線是緊挨着住對角線並位於矩陣下方。

– d<0表示來自矩陣上半部的對角線。例如:d= 1表示對角線被設置在對角線的上方並緊挨着。

matD – 單列用於形成矩陣對角線的列。

該方法爲指定的矩陣創建一個新的頭。然後新矩陣被分割爲單獨的列矩陣。類似於Mat::row() 和Mat::col() ,它是複雜度爲O(1)操作。

Mat::clone

創建一個數組及其基礎數據的完整副本。

C++: Mat Mat::clone() const

該方法創建了一個完整的數組副本。原始的step[]不會被考慮在內的。因此數組的副本是一佔用total()*elemSize()字節的連續陣列。

Mat::copyTo

把矩陣複製到另一個矩陣中。

C++: void Mat::copyTo(OutputArray m) const

C++: void Mat::copyTo(OutputArray m, InputArray mask) const

參數:

m – 目標矩陣。如果它的尺寸和類型不正確,在操作之前會重新分配。

mask – 操作掩碼。它的非零元素表示矩陣中某個要被複制。

該方法把矩陣的複製到另一個新的矩陣中在複製之前該方法會調用

m.create(this->size(), this->type);

因此,目標矩陣會在必要的情況下重新分配

儘管m.copyTo(m) works flawlessly,該函數並不處理源矩陣和目標矩陣之間有重疊的部分的情況。當操作掩碼指定以及上述的Mat::create重新分配矩陣,新分配的矩陣在數據複製到裏面之前全都被初始化爲0。

Mat::convertTo

在縮放或不縮放的情況下轉換爲另一種數據類型。

C++:

void Mat::convertTo(OutputArray m,int rtype,double alpha=1,double beta=0)const

參數:

m – 目標矩陣。如果它的尺寸和類型不正確,在操作之前會重新分配。

rtype – 要求是目標矩陣的類型,或者在當前通道數與源矩陣通道數相同的情況下的depth。如果rtype 爲負,目標矩陣與源矩陣類型相同。

beta – 可選的delta加到縮放值中去。

該方法將源像素值轉化爲目標類型saturate_cast<> 要放在最後以避免溢出

m( x;y) = saturate_cast < rType > ( α*( *this)( x;y) +β)

Mat::assignTo

提供了一個convertTo的功能形式。

C++: void Mat::assignTo(Mat& m, int type=-1 ) const

Parameters

m – 目標陣列。

type – 要求是目標陣列depth或-1(如果陣列的類型和源矩陣類型相同)

這是一個 internally 使用的由 Matrix Expressions引擎調用的方法。

Mat::setTo

將陣列中所有的或部分的元素設置爲指定的值。

C++: Mat& Mat::setTo(const Scalar& s, InputArray mask=noArray())

參數:

s – 把標量賦給陣列並轉化到陣列的實際類型。

mask – 與 *this尺寸相同的操作掩碼。這是Mat::operator=(const Scalar& s)運算符的一個高級變量。

Mat::reshape

在無需複製數據的前提下改變2D矩陣的形狀和通道數或其中之一。

C++: Mat Mat::reshape(int cn, int rows=0) const

參數:

cn – 新的通道數。若cn=0,那麼通道數就保持不變。

rows –新的行數。 若rows = 0, 那麼行數保持不變。

該方法爲*this元素創建新的矩陣頭。這新的矩陣頭尺寸和通道數或其中之一發生改變,在以下的情況任意組合都是有可能的:

ü  新的矩陣沒有新增或減少元素。通常,rows*cols*channels()在轉換過程中保持一致。.

ü  無數據的複製。也就是說,這是一個複雜度爲 O(1)的操作。通常,如果該操作改變行數或透過其他方式改變元素行索引,那麼矩陣必定是連續的。參見Mat::isContinuous()。

例如,有一存儲了STL向量的三維點集,你想用3xN的矩陣來完成下面的操作:

std::vector vec;

...

Mat pointMat = Mat(vec). //把向量轉化成Mat, 複雜度爲O(1)的運算

reshape(1). // 從Nx1的3通道矩陣得出Nx3 的單通道矩陣

//同樣是複雜度爲O(1)的運算

t(); // 最後轉置Nx3 的矩陣

//這個過程要複製所有的元素

Mat::t

轉置矩陣。.

C++: MatExpr Mat::t() const

該方法通過矩陣表達式(matrix expression)實現矩陣的轉置The method performs matrix transposition by means of matrix expressions. 它並未真正完成了轉置但卻返回一個臨時的可以進一步用在更復雜的矩陣表達式中或賦給一個矩陣的轉置矩陣對象:

Mat A1 = A + Mat::eye(A.size(), A.type)*lambda;

Mat C = A1.t()*A1; //計算(A + lambda*I)^t * (A + lamda*I).

Mat::inv

反轉矩陣

C++: MatExpr Mat::inv(int method=DECOMP_LU) const

參數:

method – 反轉矩陣的方法。有以下幾種可能的值:

– DECOMP_LU是 LU 分解一定不能是單數的。

– DECOMP_CHOLESKY 是 Cholesky LLT只適用於對稱正矩陣的分解。該類型在處理大的矩陣時的速度是LU的兩倍左右。

– DECOMP_SVD是 SVD 分解。如果矩陣是單數或甚至不是2維,函數就會計算僞反轉矩陣。

該方法執行矩陣的反轉矩陣表達。這意味着該方法返回一個臨時矩陣反轉對象並可進一步用於更復雜的矩陣表達式的中或分配給一個矩陣。

Mat::mul

執行兩個矩陣按元素相乘或這兩個矩陣的除法。

C++: MatExpr Mat::mul(InputArray m, double scale=1) const

參數:

m – 與*this具有相同類型和大小的矩陣,或矩陣表達式。

scale – 可選縮放係數。

該方法返回一個用可選的縮放比率編碼了每個元素的數組乘法的臨時的對象。 注意:這不是一個對應“*”運算符的簡單的矩陣乘法。.

例::

Mat C = A.mul(5/B); // 等價於divide(A, B, C, 5)

Mat::cross

計算3元素向量的一個叉乘積。

C++: Mat Mat::cross(InputArray m) const

參數:

m –另一個叉乘操作對象。

該方法計算了兩個3元素向量的叉乘的積被操作向量必須是3元素浮點型的具有相同形狀和尺寸的向量。結果也是一語被操作對象的具有相同形狀和大小的浮點型3元素向量。

Mat::dot

計算兩向量的點乘。

C++: double Mat::dot(InputArray m) const

參數:

m –另一個點積操作對象。

方法計算兩個矩陣的點積。如果矩陣不單列或單行的向量,用頂部到底部從左到右掃描次序將它們視爲 1 D向量。這些向量必須具有相同的大小和類型。如果矩陣有多個通道,從所有通道得到的點積會被加在一起。

Mat::zeros

返回指定的大小和類型的零數組。

C++: static MatExpr Mat::zeros(int rows, int cols, int type)

C++: static MatExpr Mat::zeros(Size size, int type)

C++: static MatExpr Mat::zeros(int ndims, const int* sizes, int type)

參數

ndims – 數組的維數。

rows–行數。

cols  –列數。

size–替代矩陣大小規格Size(cols, rows)的方法。

sizes– 指定數組的形狀的整數數組。

type– 創建的矩陣的類型。

該方法返回一個 Matlab 式的零數組初始值設定項。它可以用於快速形成一個常數數組作爲函數參數,作爲矩陣的表達式或矩陣初始值設定項的一部分。

Mat A;

A = Mat::zeros (3,3,CV_32F);

在上面的示例中,只要A不是 3 x 3浮點矩陣它就會被分配新的矩陣。否則爲現有的

矩陣 A填充零。

Mat::ones

返回一個指定的大小和類型的全爲1的數組。

C++: static MatExpr Mat::ones(int rows, int cols, int type)

C++: static MatExpr Mat::ones(Size size, int type)

C++: static MatExpr Mat::ones(int ndims, const int* sizes, int type)

參數:

ndims –數組的維數。

rows –行數。.

cols –列數。

size –替代矩陣大小規格Size(cols, rows)的方法。

sizes –指定數組的形狀的整數數組。

type –創建的矩陣的類型。

該方法返回一個 Matlab 樣式 1 的數組初始值設定項,類似Mat::zeros()。請注意,這種方法中你可以使用任意一個值和Matlab 語法初始化數組如下:

Mat A = Mat::ones (100,100,CV_8U) * 3 ;/ / 使100 x 100 矩陣裏充滿 3。

上述操作不會形成一個 100 x 100 1 的矩陣,然後乘以 3。相反,它只是記住

縮放因子(在本例中 3)在實際調用矩陣初始值設定項時使用它。

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