【opencv】 opencv之Mat詳解



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_<Mat, Mat>() 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<Point3f> 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

參數:

–另一個叉乘操作對象。

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

Mat::dot

計算兩向量的點乘。

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

參數:

–另一個點積操作對象。

方法計算兩個矩陣的點積。如果矩陣不單列或單行的向量,用頂部到底部從左到右掃描次序將它們視爲 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)在實際調用矩陣初始值設定項時使用它。

原文地址http://blog.csdn.net/giantchen547792075/article/details/7169255

發佈了8 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章