1. 程式人生 > >OpenCV 學習筆記之Mat類講解

OpenCV 學習筆記之Mat類講解

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

Mat類

OpenCV c + + n 維稠密陣列類

class CV_EXPORTS Mat

{

public:

/ / … …很多的方法...

...

/*!包括幾位欄位:

-神奇的簽名

-連續性標誌

-深度(Note:應該是位深)

-通道數

*/

int flags;Note :目前還不知道flags做什麼用的)

//!陣列的維數,> = 2

int dims ;

//!行和列的數量或 (-1,-1) 此時陣列已超過 2 維

int rows,cols;

//!指向資料的指標

uchar *data ;

//!指標的引用計數器 ;

/ / 陣列指向使用者分配的資料時,當指標為 NULL

int * refcount ;

/ / 其他成員

...

};

Mat類表示一個 n 維的稠密數值型的單通道或多通道陣列。它可以用於儲存實數或複數值的向量和矩陣、灰度或彩色影象、體素、向量場、點雲、張量、直方圖 (儘管較高維的直方圖儲存在SparseMat可能更好)。M 陣列的資料佈局是由陣列  M.step[]定義的,使元素的地址(i0,。。。。iM.dims-1),其中 0<= ik < M.size [k],可以計算為:

addr( Mi0 ;:::;iM.dims-1

) = M.data+ M.step[ 0]*i0 + M.step[ 1] *i1 + .…+ M.step[ M:dims- 1] iM:dims- 1

2維的陣列的情況下根據上述公式被減至:

addr( Mi,j)= M.data+ M.step[ 0]*i+ M.step[ 1] *j

請注意,M.step[i] > =M.step[i+1] (事實上,M.step[i] > =M.step[i+1]*M.size[i+1])。這意味著2維矩陣是按行儲存的,3 維矩陣是由平面儲存,以此類推。M.step[M.dims-1] 是最小的而且總是等於元素大小M.elemSize()。因此,Mat中的資料佈局完全相容OpenCV 1.x 中CvMat、 IplImage、 CvMatND型別。它也和標準工具包和SDK,如Numpy(ndarray),Win32(獨立裝置點陣圖)等主流的密集陣列型別相相容,也就是說,與任何使用步進(或步長)來計算畫素位置的陣列相相容。由於這種相容性,使使用者分配的資料建立Mat頭以及用OpenCV函式實時處理該頭成為可能。有很多不同的方法,建立一個Mat的物件。下面列出了最常見的選項:

使用 create(nrows,ncols,type)方法或類似的Mat(nrows,ncols,type [,fillValue])建構函式。一個新的指定了大小和型別的陣列被分配。type和cvCreateMat 方法中的type引數具有相同的含義。例如,CV_8UC1 是指一個 8 位單通道陣列,CV_32FC2 指 2 通道(複平面)浮點陣列,以此類推。

//建立一個用1+3j填充的 7 x 7 復矩陣。

Mat  M(7,7,CV_32FC2,Scalar(1,3)) ;

/ /現在將 M轉換為100 x 60的CV_8UC(15)的矩陣。

/ / 舊內容將會被釋放

M.create(100,60,CV_8UC(15)) ;

這一章導言中指出,噹噹前的陣列與指定的陣列的形狀或型別create() 分配唯一的新陣列時的形狀或型別。

建立多維陣列:

/ / 建立 100 x 100 x 100 8 位陣列

int sz[] = {100, 100, 100};

Mat. bigCube (3,sz,CV_8U,Scalar::all(0)) ;它將維度數(= 1)傳遞給Mat的建構函式,但列數設定為 1時,建立陣列將是 2 維的。因此,Mat::dims 始終是>=2的(該陣列為空時,也可以是 0)。

使用的複製建構函式或賦值運算子可以是一個數組或右側的表示式(請參閱下圖)。正像在導言中指出的,陣列賦值運算複雜度是O(1)因為當你需要它的時候,它僅複製頭和增加引用計數。Mat::clone() 方法可用於獲取全(深)的副本陣列。

為另一個數組的一部分構建頭。它可以是單個行、 單個列,幾個行,幾個列,矩形區域(代數中稱為較小值) 的陣列或對角線。這種操作也是複雜度為O(1),因為,新頭引用相同的資料。實際上,您可以使用此特性修改該陣列的一部分例如:

/ /第 5行,乘以 3,加到第 3 行,

M.row(3) = M.row(3) + M.row (5) * 3 ;

/ / 現在將第7列複製到第1列

/ / M.col(1) = M.col(7) ;/ / 這個不能實現。

Mat  M1= M.col(1) ;

M.col(7).copyTo(M1) ;

/ / 建立一種新的 320 x 240 影象

Mat img(Size(320,240),CV_8UC3) ;

/ / 選擇ROI(region of interest)

Mat roi(img,Rect(10,10,100,100)) ;

/ / 填充 (0,255,0) 的ROI (這是RGB 空間中的綠色);

/ / 320 x 240 原始影象將被修改。

roi = Scalar(0,255,0) ;

由於額外的 datastart 和 dataend 的成員,它們使得用locateROI() 計運算元陣列在主容器陣列中的相對的位置成為可能:

Mat A = Mat::eye ( 10, 10, CV_32S);

/ / 提取 A 的1 (含)到 3 (不包含)列。

Mat B = A(Range::all(),Range(1,3)) ;

/ / 提取 B 的5 (含)到 9 (不包含)行。

/ /即 C ~ A(Range(5,9),Range (1,3))

Mat C = B(Range(5,9),Range::all()) ;

Size size;Point ofs;

C.locateROI (size,ofs);

/ / size將變為 (width= 10,height= 10),ofs會變為 (x = 1,y = 5)

考慮到整個矩陣,如果您需要深層副本,使用子矩陣的sclone() 方法的提取。

為使用者分配資料建立矩陣頭。有利於執行下列操作:

1. 使用 OpenCV處理"外來"的資料(例如,當您執行 DirectShow *filter 或 gstreamer的pro-cessing 模組,等等)。例如:

void process_video_frame (const unsignedchar * pixels,

int width,int height,int step)

{

Mat img (width,height, CV_8UC3,pixels,step);

GaussianBlur (img,img ,Size(7,7),1.5,1.5) ;

}

2.快速初始化小矩陣和/或獲取超快的元素的訪問。

double m[3] [3] = {{a,b,c},{d,e,f} {g, h, i}}};

Mat M = Mat(3,3,CV_64F,m).inv() ;

本例中使用者分配資料的一些很常見情況是從CvMat 和 IplImage 轉換到Mat。為達到此目的,有些特殊的建構函式以指向CvMat 或 IplImage 和flag可選引數指示是否資料複製。從Mat到 CvMat 或 IplImage 的後臺轉換是通過型別轉換運算子 Mat::operator CvMat() const 和 Mat::operator IplImage()實現的。operators不要複製資料。

IplImage * img = cvLoadImage("greatwave.jpg",1) ;

Mat mtx(img) ;/ / IplImage *-> Mat

CvMat oldmat = mtx ;/ / Mat-> CvMat

CV_Assert (oldmat.cols = = img-> width&& oldmat.rows = = img-> height & &

oldmat.data.ptr = = (uchar *) img->imageData & & oldmat.step = = img-> widthStep);

使用 MATLAB 樣式陣列初始值設定項zeros()、 ones()、 eye(),例如:

/ / 建立具雙精度標識矩陣並將其新增到M。

M + = Mat::eye (M.rows,M.cols,CV_64F);

使用逗號分隔的初始值設定項:

/ / 建立 3 x 3 雙精度恆等矩陣

Mat M = (Mat_ <double> (3,3) <<1,0,0,0,1,0,0,0,1) ;

使用此方法,您首先呼叫具有適當的引數的 Mat_類建構函式,然後只要把 << 運算子後面的值用逗號分隔,這些值可以是常量、變數、 表示式,等等。此外請注意所需的額外的圓括號((Mat_<double> (3,3)<< 1,0,0,0,1,0,0,0,1))以免出現編譯錯誤。

陣列一旦建立起來,它可以自動通過引用計數的機制被管理。如果陣列頭是在使用者分配的資料的基礎上構建的,您應該自己處理這些資料。當沒有指向它的引用時,陣列中的資料將被釋放。如果在陣列的析構函被呼叫之前要釋放一個由矩陣頭指向的資料,請使用Mat::release()。

掌握Array類的另一個重要的環節是元素的訪問。本手冊已經描述瞭如何計算每個陣列元素的地址。通常情況下,不需要在程式碼中直接使用的公式。如果你知道陣列元素型別(它可以使用 Mat::type() 方法檢索得到),您可以用以下方式訪問二維陣列的元素Mij

M.at <double>(i,j)  + = 1.f ;

假定 M 一個雙精度浮點型陣列。有幾個變體的不同方法來針對不同的維度數進行處理。

如果您要處理整行的二維陣列,最有效的方式是獲取該行的頭指標然後只需使用普通的 C運算子[]:

/ / 正矩陣元素之和計算

/ / (假定M 是一個雙精度矩陣)

double sum = 0;

for (int i = 0 ;i < M.rows ; i + +)

{

const double *Mi = M.ptr <double> (i) ;

     for (int j = 0; j < M.cols ; j + +)

sum + = std::max(Mi [j],0.) ;

}

以上的操作中,某些操作實際上不依賴該陣列的形狀。他們只是一個接一個(或多個具有相同的座標的多個數組中的元素,例如,陣列相加)地處理陣列元素。這種操作稱為 元素指向(element-wise)。檢查是否所有的輸入/輸出陣列是連續的,即有沒有間斷在每行的結尾,是有意義的。如果是的話,將它們(這些陣列)作為單獨的一個長行來處理:

/ / 計算正矩陣元素,優化的變數的總和

double sum = 0;

int cols =M.cols,rows = M.rows ;

if(M.isContinuous())

{

    cols * = rows ;

    rows = 1 ;

}

for (int i = 0 ;i < rows; i + +)

{

const double * Mi = M.ptr <double>(i) ;

for (int j = 0; j < cols ; j ++)

   sum + = std::max (Mi [j],0.) ;

}

對於連續的矩陣來說,外部迴圈體只需一次執行。所以,開銷是規模較小,

小型矩陣的情況下尤其明顯。

最後,還有足以成功跳過連續的行之間的間隔智慧的STL 樣式迭代器:

/ / 計算正矩陣元素和基於迭代器型別的變數之和

double sum = 0;

Mat Const Iterator_ <double> it =M.begin <double> (),it_end = M.end <double> () ;

for(; it! = it_end ; ++it)

sum+ = std::max (*it,0.);

矩陣迭代器是隨機存取的迭代器,所以他們可以被傳遞給任何 STL 演算法,包括 std::sort()。

矩陣表示式

這是已經實現的可以組合在任意複雜的表示式中的矩陣運算操作, (此處 A 、B 的表示矩陣 (Mat)、 s表示標量(Scalar),alpha為實數標量 (雙精度型):

  加法、減法、求反: A + B + A-B、 A + s、 A-s、 s + A、 s-A、-A;

  縮放: A * alpha

  每個元素乘法和除法: A.mul (B)、 A / B,alpha/A

  矩陣相乘: A * B

  大動脈轉位: A.t() (指在)

 矩陣反演和偽反演,求解線性系統和最小二乘問題:

A.inv([method]) (~ A-1) , A.inv([method])*B (~ X: AX=B)

  比較: cmpop B、 cmpop alpha、 alpha cmpop A,其中 cmpop 是以下幾種運算子之一: >,> =,= =,! =,< =,<。比較的結果是其元素設定為 255的 8 位單通道掩碼(如果特殊元素對滿足條件) 或 0。

  按位邏輯運算: logicop B、 logicop s slogicop A、 ~ A,其中 logicop 是以下運算子之一: &,|, ^.

  元素的最小值和最大值:分 (A、 B)、 民 (,alpha),最大值 (A,B),最大 (,alpha)

  元素的絕對價值: abs(A)

  叉乘,點乘: A.cross(B) A.dot(B)

  任何標量與矩陣或矩陣的函式,返回一個矩陣或標量(scalar),如norm、, mean、 sum、countNonZero、trace、determinant、repeat和其他。

  矩陣初始值設定項(Mat::eye(),Mat::zeros(),Mat::ones())、矩陣以逗號分隔的初始值設定項、可提取sub-matrices的m atrix建構函式和運算子,(請參見Mat的說明)。

  Mat_ <destination_type> () 建構函式將結果強制轉換為適當的型別。

Note:有些逗號分隔初始值設定項和一些其他的運算子可能需要顯示呼叫Mat();或Mat_<T>();的建構函式來解決可能產生的歧義。

         以下是一些矩陣表示式的例子:

//計算矩陣A的偽反演等價於A.inv(DECOMP_SVD)

SVD svd(A);

Mat pinvA =svd.vt.t()*Mat::diag(1./svd.w)*svd.u.t();

//計算萊文伯格-馬夸特演算法中的引數的新向量

x -= (A.t()*A +lambda*Mat::eye(A.cols,A.cols,A.type())).inv(DECOMP_CHOLESKY)*(A.t()*err);

//用“Unsharp Mask”演算法銳化影象

Mat blurred; double sigma = 1, threshold =5, amount = 1;

GaussianBlur(img, blurred, Size(), sigma,sigma);

Mat lowConstrastMask = abs(img - blurred)< threshold;

Mat sharpened = img*(1+amount) +blurred*(-amount);

img.copyTo(sharpened, lowContrastMask);

下面正式講解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++: template<typename T, int n>explicit Mat::Mat(const Vec<T, n>& vec, bool copyData=true)

C++: template<typename T, int m, intn> explicit Mat::Mat(const Matx<T, m, n>& vec, bool copyData=true)

C++: template<typename T> explicitMat::Mat(const vector<T>& 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生成一個矩陣的各類建構函式。如 輸出資料的自動分配 一節(該節內容在第一章 Introduction)中所提到的,往往預設建構函式就足夠了,不同的矩陣可以由 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_<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