1. 程式人生 > >OpenCV參考手冊之Mat類詳解(二)

OpenCV參考手冊之Mat類詳解(二)

譯文參考The OpenCV Reference Manual (Release 2.3)August 17 2011

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

引數:

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)在實際呼叫矩陣初始值設定項時使用它。